3

これは機能しません:

Debug.Assert(Thread.CurrentThread.Name == "Main Thread"); //doesn't work
                     //name is null despite name
                     //in debugger being "Main Thread"

これは機能します:

Debug.Assert(Thread.CurrentThread.ManagedThreadId == 1);

しかし、私はちょうど疑問に思っていました:

  • a)メインスレッド用であるManagedThreadIdことが保証されていますか?1
  • b) これを行うためのより良い方法はありますか? 属性経由は、私がフィードする最もきちんとしたものです。

私は Silverlight プロジェクトに取り組んでいます。関連性があるかどうかはわかりませんが、Silverlight と他の .net ランタイムに違いがあると思われる場合はコメントしてください。

4

3 に答える 3

2

Thread.CurrentThread.Name は、名前が設定されている場合にのみ機能します。私の推測では、デバッガーがデフォルト名を提供しています。スレッドの名前を設定できますか (作成時、またはおそらくメインを押した直後)? このようにして、アサーションを確認できます。

何かのようなもの:

static void Main()
{
    // Check whether the thread has previously been named 
    // to avoid a possible InvalidOperationException. 
    if(Thread.CurrentThread.Name == null)
    {
        Thread.CurrentThread.Name = "MainThread";
    }
}

参照: http://msdn.microsoft.com/en-us/library/system.threading.thread.name.aspx

于 2012-10-24T11:45:54.037 に答える
1

このコードをentryアプリケーションのメソッドに入れます -

static int mainThreadId;

// In Main method:
mainThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;

// If called in the non main thread, will return false;
public static bool IsMainThread
{
    get
    {
       return System.Threading.Thread.CurrentThread.ManagedThreadId
                                                == mainThreadId;
    }
}
于 2012-10-24T12:05:18.267 に答える
0

プロパティを確認しIsBackgroundます。

他のスレッドがフォアグラウンド スレッドとして実行される可能性があるため、これは完全な解決策ではないかもしれませんが、十分である可能性があります。

于 2012-10-24T11:44:46.807 に答える