【问题标题】:How to make a void method inside a for loop to run in async way如何在for循环中创建一个void方法以异步方式运行
【发布时间】:2023-01-12 14:41:29
【问题描述】:

我有一个 for 循环,在这个 for 循环中,它有一个 void 方法,这通常需要时间。 我想以async的方式运行这个void方法,并想在doStuff(ele)为list中的所有ele完成后调用printFinalMessage()。

for (int ele in list)
{
    doStuff(ele);
}

printFinalMessage()

将不胜感激任何帮助。

【问题讨论】:

  • 你的意思是异步的,还是你的意思是多线程的?如果doStuff 是async,为什么它不返回诸如Task 之类的可等待对象?
  • doStuff I/O 或 CPU 受限吗?

标签: c# .net asynchronous async-await


【解决方案1】:

您的问题的关键字是等待所有任务这是来自 Microsoft 的 reference,将您的任务添加到列表中并等待所有任务。注意DoStuff()的签名是Task

var list = new List<int>() { 1, 2, 3};

var taskList = new List<Task>();

foreach(var ele in list)
{
    taskList.Add(DoStuff(ele));
    //or you can write like
    //var task = DoStuff(ele); 
    //taskList.Add(task);
}

await Task.WhenAll(taskList);

public Task DoStuff(int ele){ }

【讨论】:

  • Task 实际上就足够了。 async 在技术上不是签名的一部分。
  • 请注意,对于 CPU 绑定操作,这可能是不是最好的主意。
  • 好的,删除异步
【解决方案2】:
List<Task> tasks = new List<Task>();    
foreach (var element in list)
{
    tasks.Add(element);
}

Task.WaitAll(tasks.ToArray());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 2014-04-13
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多