c# - 如何从主线程的后台线程调用方法?

标签 c# multithreading

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

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);
}

关于c# - 如何从主线程的后台线程调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31317814/

相关文章:

c# - 文本 block 文本选择

c# - 将自定义根 CA 与 HttpClient 结合使用

c# - ActorSelection 的 Akka.net 死锁问题

c# - 内线程异常处理

c++ - 以符合 C++ 标准的方式实现 std::malloc

Python Multiprocessing : Pool. map() 似乎根本不调用函数

c# - Windows服务调用WCF服务(web http配置)

c# - 无法启动应用程序

Linux线程 sleep 与读取

c++ - 在构造函数和析构函数中锁定共享资源