gpt4 book ai didi

c# - C#中如何判断一个线程是不是主线程

转载 作者:IT王子 更新时间:2023-10-29 04:00:58 27 4
gpt4 key购买 nike

还有其他帖子说你可以在windows窗体中创建一个控件,然后检查InvokeRequired属性来查看当前线程是否是主线程。

问题是您无法知道该控件本身是否是在主线程上创建的。

我使用下面的代码来判断一个线程是否是主线程(启动进程的线程):

if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA ||
Thread.CurrentThread.ManagedThreadId != 1 ||
Thread.CurrentThread.IsBackground || Thread.CurrentThread.IsThreadPoolThread)
{
// not the main thread
}

有人知道更好的方法吗?看起来这种方式在运行时的 future 版本中可能容易出错或中断。

最佳答案

你可以这样做:

// Do this when you start your application
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; }
}

编辑 我意识到你也可以通过反射来做到这一点,这里有一个片段:

public static void CheckForMainThread()
{
if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA &&
!Thread.CurrentThread.IsBackground && !Thread.CurrentThread.IsThreadPoolThread && Thread.CurrentThread.IsAlive)
{
MethodInfo correctEntryMethod = Assembly.GetEntryAssembly().EntryPoint;
StackTrace trace = new StackTrace();
StackFrame[] frames = trace.GetFrames();
for (int i = frames.Length - 1; i >= 0; i--)
{
MethodBase method = frames[i].GetMethod();
if (correctEntryMethod == method)
{
return;
}
}
}

// throw exception, the current thread is not the main thread...
}

关于c# - C#中如何判断一个线程是不是主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2374451/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com