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

我有一个小问题.

我承认我在.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);

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...