在C#中,如何将主线程调用的函数排队?

在C#中,如何将主线程调用的函数排队?,c#,multithreading,dispatch,C#,Multithreading,Dispatch,我已经找到了很多关于如何在UI线程上调用函数的资源,但是我有一些只允许从主线程运行的逻辑。有没有办法在主线程上获取一个调度程序并调用它?编辑:OP询问的程序实际上有单独的UI和主线程 您可以随时使用创建新线程/任务 tokenSource = new CancellationTokenSource(); token = tokenSource.Token; Task.Factory.StartNew(() => {

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

编辑: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;
        }
    }

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

dispatcher是特定于特定UI框架的概念(此处为WPF)。没有可用于针对任何线程的调度程序。想象以下线程:

while (true) Console.WriteLine("x");
您将如何调用该线程上的某些内容?它无法完成,因为该线程总是忙于做其他事情。它不合作


我有点怀疑你是否需要在“主线”上调用一些东西。但我会逐字回答这个问题。您需要使主线程协作并接受来自其他线程的工作。可能是一个
操作队列
或一个布尔标志,告诉该线程执行特定的操作。

UI线程应该是任何合理程序中的主线程。仅当主线程运行的是允许您向其发送委托的东西(例如消息循环)时。主线程的结构如何?当您希望调用函数时,它在做什么?如果它在将来某个时候发生,可以吗?@Psymunn而不是创建一个新线程作为您的UI线程,然后离开主线程去做其他工作,为什么不让你的主线程成为你的UI线程,让你创建的另一个线程去做你的主线程正在做的任何工作呢?不幸的是,我无法控制架构。UI线程名为WPF thread,从主线程(即入口点为
public static void Main(字符串[]args)的线程)启动
我感觉到了你的痛苦…很抱歉,我没有更多的帮助。祝你的项目好运。谢谢。我会检查API,看看是否有一些静态队列可以访问,以便为主线程排队任务。我知道这似乎有点奇怪,但是的,这确实是需要的。