gpt4 book ai didi

c# - 并行运行两个异步任务并在 .NET 4.5 中收集结果

转载 作者:IT王子 更新时间:2023-10-29 03:35:14 25 4
gpt4 key购买 nike

我已经尝试了一段时间来获得一些我认为使用 .NET 4.5 会很简单的东西

我想同时启动两个长时间运行的任务并收集
以最佳 C# 4.5 (RTM) 方式产生结果

以下是可行的,但我不喜欢它,因为:

  • 我要 Sleep成为一个异步方法,所以它可以 await其他方法
  • 它看起来很笨拙 Task.Run()
  • 我认为这甚至根本没有使用任何新的语言功能!

工作代码:

public static void Go()
{
Console.WriteLine("Starting");

var task1 = Task.Run(() => Sleep(5000));
var task2 = Task.Run(() => Sleep(3000));

int totalSlept = task1.Result + task2.Result;

Console.WriteLine("Slept for a total of " + totalSlept + " ms");
}

private static int Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
Console.WriteLine("Sleeping for " + ms + " FINISHED");
return ms;
}

非工作代码:

更新:这确实有效并且是正确的方法,唯一的问题是 Thread.Sleep

此代码不起作用,因为调用了 Sleep(5000)立即启动任务运行所以 Sleep(1000)在完成之前不会运行。即使 Sleep 也是如此是async而且我没有使用 await或调用 .Result太快了。

我想也许有办法让一个非运行的 Task<T>通过调用 async方法,这样我就可以调用 Start()在这两个任务上,但我不知道如何获得 Task<T>从调用异步方法。

public static void Go()
{
Console.WriteLine("Starting");

var task1 = Sleep(5000); // blocks
var task2 = Sleep(1000);

int totalSlept = task1.Result + task2.Result;

Console.WriteLine("Slept for " + totalSlept + " ms");
}

private static async Task<int> Sleep(int ms)
{
Console.WriteLine("Sleeping for " + ms);
Thread.Sleep(ms);
return ms;
}

最佳答案

async Task<int> LongTask1() { 
...
return 0;
}

async Task<int> LongTask2() {
...
return 1;
}

...
{
Task<int> t1 = LongTask1();
Task<int> t2 = LongTask2();
await Task.WhenAll(t1,t2);
//now we have t1.Result and t2.Result
}

关于c# - 并行运行两个异步任务并在 .NET 4.5 中收集结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12343081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com