【发布时间】:2021-08-25 14:23:50
【问题描述】:
我正在尝试学习如何使用异步任务,并且我真的很难让一个简单的示例正常工作。我在下面提供了一个非常简化的版本。
public void Calculate()
{
int a1 = 1;
int a2 = 2;
int b1 = 3;
int b2 = 4;
int c3 = 5;
int c4 = 6;
int c5 = 7;
int c6 = 8;
int c7 = 9;
// Do next 2 lines in parallel
int rank1 = Evaluate(a1, a2, c3, c4, c5, c6, c7);
int rank2 = Evaluate(b1, b2, c3, c4, c5, c6, c7);
// wait for above 2 lines and use values to get result
int result = EvaluateOutcome(rank1, rank2);
}
public static int Evaluate(int i1, int i2, int i3, int i4, int i5, int i6, int i7)
{
// do something complicated and return value - simulate here with random number
Random rand = new Random();
return rand.Next(0,10);
}
public static int EvaluateOutcome(int rank1, int rank2)
{
return rank1 * rank2;
}
在我的真实代码中计算rank1 和rank2 是一个漫长的过程,但计算是相互独立的。我想尝试同时运行这两个计算,希望能减少一半的处理时间。我需要在计算结果之前等待两个计算完成。
我想我应该能够做这样的事情:
private async Task Evaluate(int a1, int a2, int b1, int b2, int c3, int c4, int c5, int c6, int c7)
{
Task task1 = Evaluate(a1, a2, c3, c4, c5, c6, c7);
Task task2 = Evaluate(b1, b2, c3, c4, c5, c6, c7);
await Task.WhenAll(task1, task2);
}
但这不会编译,我不确定如何从任务中获取结果并将它们放入我的rank1 和rank2 int 变量中。我认为这应该非常简单,但我找不到一个明确的例子。一些帮助将不胜感激。
【问题讨论】:
-
使用
Task.Run()...添加static Task<int> EvaluateAsync(int i1, ...) => Task.Run((i1, ..). => Evaluate(i1,...);然后Task<int> task1 = EvaluateAsync(a1, ...);然后在await Task.WhenAll之后你可以得到task1.Result作为rank1类似的东西task2 -
这听起来不错塞尔文。如果您能将完整的代码放入答案中,我将不胜感激。非常感谢
-
或者更好:参数集列表,并将其传递给
Parallel.ForEach -
你能告诉我如何请查理
-
@Selvin 如果您能提供建议的代码的详细信息,那就太好了。我认为这就是答案,但我自己无法弄清楚 TIA
标签: c# async-await parallel-processing task