我有一个小问题.
我承认我在.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 end) { await Task.Yield(); //Do very expensive work }
在这种情况下,该方法将按照我的预期行事.但是有更好的解决方案吗?我觉得应该比编写那行代码更容易/更明智.我知道我可以创建一个Task / Thread对象并调用Start()方法,但这需要更多的工作.我只是认为使用新的异步/等待功能这种事情会更容易.
解决方法
因此,首先,您需要一种同步执行非常昂贵的工作的方法:
public void DoLotsOfWork<T>(T[] data,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);