ASP.NET MVC Task.Run运行状态

时间:2017-10-11 10:28:03

标签: asp.net-mvc multithreading task

我想运行如下任务:

Task.Run(() => GetWeatherAsync());

此任务只能睡20秒:

public async void GetWeatherAsync()
{
    System.Threading.Thread.Sleep(20000);
}

我想阻止新用户进入此范围(方法),直到上一个进程运行。

如果当前用户在GetWeatherAsync等待并且新用户输入,会发生什么情况。

1 个答案:

答案 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