gpt4 book ai didi

c# - 在 .Net 4.5 中使用 async/await 编写多线程方法

转载 作者:太空狗 更新时间:2023-10-29 19:59:56 24 4
gpt4 key购买 nike

我有一个小问题。

我承认我在 .Net 4.5 之前并没有太多地使用多线程,但是有了新的 async/await 功能,我决定尝试一下。我开始试验它,一切似乎都很好,但我无法在网络上的任何地方找到解决我的“问题”的方法。

所以大家解释一下await如何与.Net平台新改造的方法(例如WriteAsync()ReadAsync())一起使用> 等...),但如果我想将它用于我自己的方法怎么办?例如,假设我正在执行一个非常昂贵的计算,并希望我所有的 4 个核心都在处理它。我会有类似的东西:

async Task DoLotsOfWork<T>(T[] data, int start, int end)
{
//Do very expensive work
}

但是因为我没有 await 关键字,所以该方法只被视为同步方法。我想从外部调用它 4 次,以便它可以在我所有的内核上运行,同时我向用户显示一些明智的东西(例如“请稍候...”)。我能想到的唯一解决方案是在方法的开头添加 await Task.Yield();。像这样:

async Task DoLotsOfWork<T>(T[] data, int start, int end)
{
await Task.Yield();
//Do very expensive work
}

在这种情况下,该方法的行为将与我预期的一样。但是有更好的解决方案吗?我觉得它应该比准确地编写那行代码更容易/更明智。我知道我可以创建一个 Task/Thread 对象并调用 Start() 方法,但这需要更多的工作。我只是认为有了新的 async/await 功能,这种事情会更容易。

最佳答案

因此,首先您需要一种同步执行非常昂贵的工作的方法:

public void DoLotsOfWork<T>(T[] data, int start, int end) 
{
Thread.Sleep(5000);//placeholder for real work
}

然后我们可以使用 Task.Run 在线程池线程中启动这项工作的多个实例。

List<Task> tasks = new List<Task>();
for(int i = 0; i < 4; i++)
{
tasks.Add(Task.Run(()=>DoLotsOfWork(data, start, end));
}

然后我们可以进行非阻塞等待,直到所有这些都完成:

await Task.WhenAll(tasks);

关于c# - 在 .Net 4.5 中使用 async/await 编写多线程方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15274332/

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