如何在主线程上从后台线程调用方法?

时间:2015-07-09 12:40:34

标签: c# multithreading

我有一个控制台应用程序,我在其中创建一个worker(后台)线程。线程完成后我想在主线程上执行一个方法。 这是我的代码:

using System;
using System.Threading;

namespace ConsoleApplication
{
    class Program
    {
        private void ProcessTask()
        {
            Console.WriteLine("ProcessTask: " + Thread.CurrentThread.ManagedThreadId);
            Action onFinished = OnTaskFinished;
            onFinished.Invoke();
        }

        private void OnTaskFinished()
        {
            Console.WriteLine("OnTaskFinished: " + Thread.CurrentThread.ManagedThreadId);
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Main: " + Thread.CurrentThread.ManagedThreadId);

            Program program = new Program();
            Thread thread = new Thread(program.ProcessTask);
            thread.IsBackground = true;
            thread.Start();

            Console.ReadKey();
        }

    }
}

但OnTaskFinished方法在后台线程上执行,而不是在主线程上执行。 应用程序写入控制台以下输出:

Main: 9
ProcessTask: 10
OnTaskFinished: 10

但我想:

Main: 9
ProcessTask: 10
OnTaskFinished: 9

这个问题的正确解决方案是什么? 谢谢!

1 个答案:

答案 0 :(得分:2)

控制台应用程序没有像您可以调用的UI应用程序那样的“主线程”。将项目从控制台应用程序切换到窗口化应用程序,然后切换onFinished.Invoke();以使用UI框架的调用(WPF和Winforms以不同方式执行)。

还有一些类可以使BackgroundWorker变得更容易,同样使用async / await也可以轻松实现。

private async Task StartProcessTask()
{
    Console.WriteLine("StartProcessTask: " + Thread.CurrentThread.ManagedThreadId);
    await Task.Run(()=>ProcessTask());
    OnTaskFinished();
}

private void ProcessTask()
{
    Console.WriteLine("ProcessTask: " + Thread.CurrentThread.ManagedThreadId);
}

private void OnTaskFinished()
{
    Console.WriteLine("OnTaskFinished: " + Thread.CurrentThread.ManagedThreadId);
}