在执行其余代码之前等待ThreadPool完全完成? C#.NET

时间:2017-05-20 08:05:46

标签: c# .net callback threadpool

我想知道线程或等待回调何时在执行之前的代码之前完成。这是我目前的代码:

foreach (var ip in iPAddresses)
            {
                string loopIp = ip;

                WaitCallback func = delegate (object state)
                {
                    if (PingHost(loopIp, portNumber))
                    {
                        Console.WriteLine("IP Found at: " + loopIp + ":" + portNumber);
                        IPAddressesAndPortNumbersList.Add(loopIp, portNumber);
                    }

                };

                ThreadPool.QueueUserWorkItem(func);

                //I want the below to be executed after the thread has finished completely
                Console.WriteLine("I have finished...");
            }

解决方案:我知道您可以使用普通线程并执行此功能,但是,对于我正在进行的工作,这样做会很慢。我发现这是在waitcallback函数中完成require工作的最快方法

1 个答案:

答案 0 :(得分:0)

我认为你需要Task.WaitAll或Task.WhenAll。以下是示例:

当您想要并行执行某些任务(并且没有返回值)时,

Task.WaitAll及其重载。

var tasks = new[]
{
    Task.Factory.StartNew(() => DoSomething1()),
    Task.Factory.StartNew(() => DoSomething2()),
    Task.Factory.StartNew(() => DoSomething3())
};    
Task.WaitAll(tasks);

Task.WhenAll当您想要使用返回值执行某些任务时,它会执行操作并将结果放入数组中。它是线程安全的,您不需要使用线程安全的容器并自己实现添加操作。

var tasks = new[]
{
    Task.Factory.StartNew(() => GetSomething1()),
    Task.Factory.StartNew(() => GetSomething2()),
    Task.Factory.StartNew(() => GetSomething3())
};    
var things = Task.WhenAll(tasks);