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、私の悪い... –