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

本文关键字:线程 后台 调用 方法 | 更新日期: 2023-09-27 18:01:45

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

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

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

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

控制台应用程序没有像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);
}