【问题标题】:Wait for ThreadPool to completely finish before executing the rest of the code? C#.NET在执行其余代码之前等待 ThreadPool 完全完成? C#.NET
【发布时间】:2017-10-20 08:58:36
【问题描述】:

我希望能够知道线程或等待回调何时首先完成,然后再执行之后的代码。这是我当前的代码:

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 工作的最快方法

【问题讨论】:

  • 为什么不用Task.Run?这是在ThreadPool 上开始工作的现代方式。
  • 我试过了,等我的任务慢下来
  • 你根本不需要任何线程,只需要一个正确编写的可等待 PingHost()
  • 嗯,我试试这个

标签: c# .net callback threadpool


【解决方案1】:

我认为您需要 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多