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 仅在设置名称时才有效。我的猜测是调试器提供了一个默认名称。您可以设置线程的名称(在创建时,或者在您点击 main 时)?这样您就可以检查断言。

就像是:

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 回答