基於this answer,我有以下ASP.NET應用程序異步運行進程。但是,當我做出多個並行請求時,每個請求只在前一個請求完成後才運行。爲什麼會發生?爲什麼異步運行進程阻塞線程?
public async Task<ActionResult> Index(string url)
{
var exePath = Server.MapPath("~/App_Data/dummy/bin/dummy.exe");
var startInfo = new ProcessStartInfo
{
FileName = exePath,
Arguments = url,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true
};
var process = new Process{ EnableRaisingEvents = true, StartInfo = startInfo};
var tcs = new TaskCompletionSource<Process>();
process.Exited += (sender, a) =>
{
tcs.SetResult(process);
};
process.Start();
await tcs.Task;
// todo: return process status/output
return View();
}
爲dummy.exe
的代碼,堪稱MVC行動的過程,就是:
class Program
{
static void Main(string[] args)
{
Thread.Sleep(5000);
Console.WriteLine("Hello world!");
}
}
隨機猜測 - 會話狀態鎖定? –
@RenéVogt:這裏的'Main'方法是程序上面調用的方法的一部分,而不是其他方法。這裏的方法是一個MVC動作,所以它被稱爲請求管道的一部分。 –
@ChrisPratt thx,我的壞... –