为了方便讨论,将 UI 线程视为调用了 Application.Run() 或者它的重载之一被调用并且有一个正在运行的活动消息循环。

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

我想要这个的原因是因为我有一个带有长时间运行的私有函数的类。该类本身已经是多线程的,并且该类的用法使得它可以从 UI 或从进行处理的后台线程中使用。这个功能也属于这个网络。但我不希望它阻塞 UI 线程。所以我想检测我是否在 UI 线程上运行,如果是,则将函数调用分叉到后台线程(可能是 ThreadPool, ,但这不是本次讨论的问题)。这完全是行为良好的,但后台线程可能依赖于函数的输出,因此对它们来说阻塞更好,而 UI 线程以更“设置后忘记”的方式访问它。

有帮助吗?

解决方案

我会建议它的那种决定调用者应该做出。你总是可以编写包装方法,使其更容易 - 但它意味着你不会有一种“奇怪”的局面呼叫者是(问题如UI框架,你不知道,还是其他什么东西有一个事件循环),你让他们错误的决定。

如果该方法不断需要提供在右螺纹反馈,我会传递一个ISynchronizeInvoke(由Control实现)做,在一个UI不可知方式。

其他提示

如果您有权访问 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 说你是或不是。

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

scroll top