如何在C#中对MainThread调用的函数进行排队?

时间:2015-05-14 20:53:17

标签: c# multithreading dispatch

我已经找到了很多关于如何在UI线程上调用函数的资源,但我有一些逻辑只允许从主线程运行。有没有办法在主线程上获取调度程序并在其上调用?

3 个答案:

答案 0 :(得分:6)

“调度程序”是特定于特定UI框架的概念(此处为:WPF)。没有可用于定位任何线程的调度程序。想象一下以下主题:

while (true) Console.WriteLine("x");

你打算如何在该线程上调用某些内容?它无法完成,因为该线程永远忙着做其他事情。它没有合作。

我有点怀疑你需要在“主线程”上调用一些东西。但我会从字面上回答这个问题。您需要使主线程合作并接受来自其他线程的工作。也许是一个Action的队列或一个布尔标志,告诉该线程做某些特定的事情。

答案 1 :(得分:1)

您可以使用信令+数据结构的组合。定义一个变量来保存所需函数调用的详细信息(可能是带参数的结构),并让主线程定期测试是否需要调用。确保锁定手柄多线程陷阱所需的对象。您还可以拥有一个信号对象,并在其上有启动器Monitor.Wait,主线程将在函数完成时发出信号。

答案 2 :(得分:0)

编辑:OP质疑的程序确实有单独的UI和主线程......

您可以随时使用

创建新的线程/任务
        tokenSource = new CancellationTokenSource();
        token = tokenSource.Token;

        Task.Factory.StartNew(() =>
        {
            doSomeWork();
        }, token);

使用令牌以便您可以取消该任务。如果出现问题或任务挂起,您可以取消它。您可能已经阅读过有关TPL库的内容,但如果没有,请查看它是否适用于您想要做的事情。

为了让我的答案更加完整,我想添加这个...我不确定这可能会或可能不适用于你的情况但在正常情况下你会做这样的事情来更新或使用来自工作线程的主线程。

    private void doSomeWork()
    {
        // do work here -->

        if (someObject.InvokeRequired)
        {
            someObject.BeginInvoke((Action)delegate() { someObject.Property = someValue; });
        }
        else
        {
            someObject.Property = someValue;
        }
    }