gpt4 book ai didi

c# - 如何检测我们是否在 UI 线程上?

转载 作者:可可西里 更新时间:2023-11-01 08:02:17 25 4
gpt4 key购买 nike

为了论证,将 UI 线程视为已调用 Application.Run() 或对其调用的其中一个重载并且正在运行事件消息循环的线程。

有没有办法检测我们当前是否在这样的线程上执行?

我想要这个的原因是因为我有一个具有长期运行的私有(private)函数的类。这个类本身已经是多线程的,并且这个类的用法是这样的,它可以从 UI 或后台线程进行处理。这个功能也属于这个网。但我不希望它阻塞 UI 线程。所以我想检测我是否在 UI 线程上运行,如果是,则将函数调用 fork 到后台线程(可能是 ThreadPool,但这不是本次讨论的问题)。这是完全正常的,但后台线程可能依赖于函数的输出,因此对它们进行阻塞更好,而 UI 线程以更“一劳永逸”的方式访问它。

最佳答案

如果您有权访问 FormControl,您可以检查 InvokeRequired属性(property);如果您在 UI 线程上,这将返回 false,否则返回 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 说明您是否正在运行。

关于c# - 如何检测我们是否在 UI 线程上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1149402/

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