【问题标题】:Wait for all Tasks on the ThreadPool to finish等待 ThreadPool 上的所有任务完成
【发布时间】:2015-12-10 09:18:00
【问题描述】:

这可能有一个非常简单的答案,已经在某处发布,但也有很多关于线程的旧误导信息。

我的问题是:如何防止我的控制台在后台工作完成之前终止?由于Task 是在我的程序的业务层中创建的,所以当控制台终止时我无法访问它(不像这个简单的例子)。有什么方法可以等待在我的应用程序上下文中创建的所有任务?

public class Program
{
    private static void Main(string[] args)
    {
       DoBackgroundWork();
       System.Console.WriteLine("Doing something else during background work");

       // Wait for all created Tasks to complete before terminating
       ???
    }

    private static void DoBackgroundWork()
    {
        var task = Task.Run(() =>
        {
            System.Console.WriteLine("Starting background work");
            Thread.Sleep(10000);
            System.Console.WriteLine("Background work finished!");
        });
    }
}

【问题讨论】:

  • 如果您需要添加一个辅助类,并将所有任务添加到其中,您会怎么想?
  • 您尝试过 ManualResetEvent 吗?

标签: c# .net multithreading asp.net-4.5


【解决方案1】:

返回任务以便您等待。

private static void Main(string[] args)
{
    var task = DoBackgroundWork();
    System.Console.WriteLine("Doing something else during background work");

    // Wait for all created Tasks to complete before terminating
    task.Wait();
}

private static Task DoBackgroundWork()
{
    var task = Task.Run(() =>
    {
        System.Console.WriteLine("Starting background work");
        Thread.Sleep(1000);
        System.Console.WriteLine("Background work finished!");
    });

    return task;
}

【讨论】:

  • 嗯,这就是问题所在。就像我在我的问题中所说的那样。任务实际上是在我的业务层中创建的,当控制台停止时,我无权访问它。我不能一路退货。或者也许这是解决它的唯一方法。通过使用可等待的方法,但我希望避免需要进行的大规模重构
  • 我明白了,让我想想:)
猜你喜欢
  • 2021-06-12
  • 2011-03-17
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 2012-04-13
相关资源
最近更新 更多