15

議論のために、UIスレッドを、呼び出しApplication.Run()またはそのオーバーロードの1つが呼び出され、アクティブなメッセージループが実行されているスレッドと見なします。

そのようなスレッドで現在実行されているかどうかを検出する方法はありますか?

これが必要な理由は、実行時間の長いプライベート関数を持つクラスがあるためです。クラス自体はすでにマルチスレッド化されており、このクラスの使用法は、UIまたは処理を実行するバックグラウンドスレッドのいずれかから使用される可能性があるようなものです。この機能もこのネットに分類されます。しかし、UIスレッドをブロックしたくありません。したがって、UIスレッドで実行しているかどうかを検出し、実行している場合は、関数呼び出しをバックグラウンドスレッドにフォークします(おそらくThreadPool、これはこの説明では問題になりません)。これは完全に正常に動作しますが、バックグラウンドスレッドはおそらく関数の出力に依存しているため、それらをブロックする方が適切ですが、UIスレッドはより「設定して忘れる」方法でアクセスします。

4

6 に答える 6

13

Formまたはにアクセスできる場合は、プロパティControlを確認できます。InvokeRequiredこれはfalse、UIスレッドを使用しtrueている場合とそうでない場合に返されます。をチェックできないコンテキストで発生した場合はControl、プログラムに静的プロパティを簡単に設定して、チェックすることができます。Thread.CurrentThread起動時にへの参照を保存Thread.CurrentThreadし、知る必要があるときにその参照と比較します。

static class Program
{
    private static Thread _startupThread = null;

    [STAThread]
    static void Main()
    {
        _startupThread = Thread.CurrentThread;

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

    public static bool IsRunningOnStartupThread()
    {
        return Thread.CurrentThread == _startupThread;
    }
}

電話Program.IsRunningOnStartupThreadをかけることで、あなたがそうであるboolかどうかを言うことができます。

于 2009-07-19T07:26:46.630 に答える
11

bool isMessageLoopThread = System.Windows.Forms.Application.MessageLoop;

于 2009-11-13T01:36:53.307 に答える
7

私はそれが発信者が下すべき種類の決定であることを提案します。いつでもラッパーメソッドを記述して簡単にすることができますが、これは、呼び出し元が「奇妙な」状況(たとえば、知らないUIフレームワーク、またはイベントループを持つ他の何か)にあるという問題が発生しないことを意味します。 )そしてあなたは彼らのために間違った決定をします。

メソッドが適切なスレッドでフィードバックを提供する必要がある場合は、UIに依存しない方法でそれを行うためにISynchronizeInvoke(によって実装された)を渡します。Control

于 2009-07-19T07:21:10.603 に答える
6

C#ライブラリのメインスレッドで実行されている検出を参照してください

于 2009-07-19T07:18:48.270 に答える