【发布时间】:2016-05-01 12:50:33
【问题描述】:
我读过这篇文章:Is it ok to await the same task from multiple threads - is await thread safe?,但我并不清楚答案,所以这里有一个具体的用例。
我有一个方法可以执行一些异步网络 I/O。多个线程可以同时使用此方法,我不希望它们都调用网络请求,如果请求已经在进行中,我想阻塞/等待第二个线程,并让它们在单个 IO 操作后全部恢复已完成。
应该我如何编写以下伪代码?
我猜每个调用线程真的需要得到自己的Task,所以每个线程都可以得到它自己的延续,所以不是返回currentTask,我应该返回一个新的Task,它由“内部”@987654327完成@来自DoAsyncNetworkIO。
有没有一种干净的方法可以做到这一点,还是我必须手动滚动它?
static object mutex = new object();
static Task currentTask;
async Task Fetch()
{
lock(mutex)
{
if(currentTask != null)
return currentTask;
}
currentTask = DoAsyncNetworkIO();
await currentTask;
lock(mutex)
{
var task = currentTask;
currentTask = null;
return task;
}
}
【问题讨论】:
-
我也有同样疑惑的一种情况:我从通过多个异步事件处理程序调用的方法从网络位置检索(可能)相同的图像。我不想从网络两次获得相同的图像,我希望一个任务等待“下载”任务。
-
另见stackoverflow.com/questions/16820388/…(虽然不是重复的,IMO)
-
另见此线程(可能有答案):stackoverflow.com/questions/13530158/…
标签: c# multithreading asynchronous async-await