我想运行如下任务:
Task.Run(() => GetWeatherAsync());
此任务只能睡20秒:
public async void GetWeatherAsync()
{
System.Threading.Thread.Sleep(20000);
}
我想阻止新用户进入此范围(方法),直到上一个进程运行。
如果当前用户在GetWeatherAsync
等待并且新用户输入,会发生什么情况。
答案 0 :(得分:4)
使用Task.Run
不会使您的方法异步。只需使用GetWeatherAsync
方法而不需要额外开销(因为它已经是异步),ASP.NET会在新线程中运行每个请求。你这里不需要另一个线程。
你不应该使用async void
。
您不应在异步方法中使用Thread.Sleep
。这是Task.Delay
。
您可以在此处使用锁定来实现目标:
// only 1 thread can be granted access at a time
static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1,1);
public async Task GetWeatherAsync()
{
// If no-one has been granted access to the Semaphore, code execution will proceed,
// otherwise this thread waits here until the semaphore is released
await semaphoreSlim.WaitAsync();
try
{
await Task.Delay(20000); // Your code here
}
finally
{
semaphoreSlim.Release();
}
}
P.S。 您需要开始阅读this Persian course about C# 5, Async。