Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待线程池上的所有任务完成_C#_.net_Multithreading_Asp.net 4.5 - Fatal编程技术网

C# 等待线程池上的所有任务完成

C# 等待线程池上的所有任务完成,c#,.net,multithreading,asp.net-4.5,C#,.net,Multithreading,Asp.net 4.5,这可能有一个非常简单的答案,已经发布在这里的某个地方,但也有很多关于线程的误导性信息 我的问题是:如何防止控制台在后台工作完成之前终止?由于任务是在我的程序的业务层中创建的,因此当控制台终止时,我无法访问它(与这个简单示例不同)。是否有某种方式可以等待在我的应用程序上下文中创建的所有任务 public class Program { private static void Main(string[] args) { DoBackgroundWork();

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

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

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

返回任务,以便您可以等待它

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

这就是问题所在。就像我在问题中说的。任务实际上是在我的业务层的最底层创建的,当控制台停止时,我没有访问它的权限。我不能一路退。也许这是唯一的解决办法。通过使用等待的方法,但我希望避免需要的巨大重构。我明白了,让我想一想:)如果需要添加一个帮助器类,并将所有任务添加到该类中,您会有什么感觉?您尝试过ManualResetEvent吗?