我有一个控制台应用程序,我在其中创建了一个工作(后台)线程。线程完成后我想在主线程上执行一个方法。这是我的代码:
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);
}
我是一名优秀的程序员,十分优秀!