【发布时间】:2013-07-11 08:34:00
【问题描述】:
我最近遇到了一个为异步/等待调用限制线程的示例。在我的机器上分析和使用代码之后,我想出了一种稍微不同的方法来做同样的事情。我不确定的是幕后发生的事情是否几乎相同,或者是否有任何值得注意的细微差异?
这是基于原始示例的代码:
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(5);
public async Task CallThrottledTasks()
{
var tasks = new List<Task>();
for (int count = 1; count <= 20; count++)
{
await _semaphore.WaitAsync();
tasks.Add(Task.Run(async () =>
{
try
{
int result = await LongRunningTask();
Debug.Print(result.ToString());
}
finally
{
_semaphore.Release();
}
}));
}
await Task.WhenAll(tasks);
Debug.Print("Finished CallThrottledTasks");
}
这是我对相同代码的看法:
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(5);
public async Task CallThrottledTasks()
{
var tasks = new List<Task>();
for (int count = 1; count <= 20; count++)
{
await _semaphore.WaitAsync();
tasks.Add(LongRunningTask().ContinueWith(t =>
{
try
{
int result = t.Result;
Debug.Print(result.ToString());
}
finally
{
_semaphore.Release();
}
}));
}
await Task.WhenAll(tasks);
Debug.Print("Finished CallThrottledTasks");
}
我可能离题了,但似乎 Task.Run 方法正在创建一个任务来运行 LongRunningTask() 然后添加一个继续来打印结果,而我的方法绕过了 Task.Run 创建的任务并且是结果有点瘦了。这是准确的还是我在这里偏离了基础?
【问题讨论】:
标签: c# multithreading async-await