WPF および Winforms の UI スレッドで検出する 質問する

WPF および Winforms の UI スレッドで検出する 質問する

アサーションメソッドを書いた確実に.CurrentlyOnUiThread()以下は、現在のスレッドが UI スレッドであるかどうかをチェックするコードです。

  • これは Winforms UI スレッドを検出する上で信頼できるでしょうか?
  • 私たちのアプリは WPF と Winforms が混在していますが、有効な WPF UI スレッドを検出する最適な方法は何でしょうか?
  • これを行うより良い方法はありますか? コード契約でしょうか?

保証.cs

using System.Diagnostics;
using System.Windows.Forms;

public static class Ensure
{
    [Conditional("DEBUG")]
    public static void CurrentlyOnUiThread()
    {
        if (!Application.MessageLoop)
        {
            throw new ThreadStateException("Assertion failed: not on the UI thread");
        }
    }
}

ベストアンサー1

使用しないでください

if(Dispatcher.CurrentDispatcher.Thread == Thread.CurrentThread)
{
   // Do something
}

Dispatcher.CurrentDispatcher現在のスレッドにディスパッチャがない場合、Dispatcher現在のスレッドに関連付けられた新しいディスパッチャを作成して返します。

代わりにこうしてください

Dispatcher dispatcher = Dispatcher.FromThread(Thread.CurrentThread);
if (dispatcher != null)
{
   // We know the thread have a dispatcher that we can use.
}

正しいディスパッチャを使用しているか、正しいスレッドを使用しているかを確認するには、次のオプションがあります。

Dispatcher _myDispatcher;

public void UnknownThreadCalling()
{
    if (_myDispatcher.CheckAccess())
    {
        // Calling thread is associated with the Dispatcher
    }

    try
    {
        _myDispatcher.VerifyAccess();

        // Calling thread is associated with the Dispatcher
    }
    catch (InvalidOperationException)
    {
        // Thread can't use dispatcher
    }
}

CheckAccess()インテリセンスにはVerifyAccess()表示されません。

また、このような方法に頼らなければならない場合は、設計が悪いことが原因である可能性が高いです。プログラム内のどのスレッドがどのコードを実行しているかを把握しておく必要があります。

おすすめ記事