c# - 并行运行方法?
问题描述
下面的代码用于模拟耗时的工作。
async Task DoWork(string n)
{
for (var i = 1; i <= 5; i++)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine($"{n} runs {i} seconds. {DateTime.Now}");
}
}
async Task<int> F1()
{
await DoWork("f1");
return 1;
}
async Task<string> F2()
{
await DoWork("f2");
return "X";
}
以下代码将按顺序F1()
运行。F2()
async Task<string> Main()
{
var f1Task = F1();
var f2Task = F2();
var f1 = await f1Task;
var f2 = await f2Task;
return $"{f1} {f2}";
}
await Main();
下面的代码可以让它们并行运行。但是,它看起来很麻烦。
async Task<string> Main2()
{
int f1 = 0;
async Task G1() { f1 = await F1(); }
string f2 = "";
async Task G2() { f2 = await F2(); }
await Task.WhenAll(Task.Run(() => G1()), Task.Run(() => G2()));
return $"{f1} {f2}";
}
await Main2();
有没有办法在不包裹它们的情况下做到这一点Task.Run()
?
解决方案
您可以使用WhenAll()
方法让您的任务并行运行,例如
async Task<int> Main()
{
var f1Task = F1();
var f2Task = F2();
await Task.WhenAll(f1Task,f2Task);
return await f1Task + await f2Task;
}
推荐阅读
- visual-studio-code - 如何在 Git bash (Windows) 中使用 Ctrl+A 选择当前命令的所有文本
- kotlin - Kotlin 扩展运算符无法将数组转换为可变参数
- swift - [UInt8] 的 Swift 扩展
- reactjs - 类型“typeof Row”不可分配给类型“ComponentType”
> & 反应节点'。TS2769 - solr - Solr 创建集合时底层核心创建失败
- sparql - 访问 .trig 文件空白节点中的多个值
- javascript - 加载图像预览后在底部添加自动滚动
- reactjs - Mobx React 存储数组推送不需要的道具
- azure - 天蓝色管道 - PowerShell
- java - spring doc中的句子“......不适用于@Aspect模型中声明的方面”是什么意思?