MVC 3 アプリケーションでオーディオ処理を行う必要があり、これらのさまざまなバックグラウンド メソッドの長所と短所を知りたいです。原則として、音声処理は長時間実行されるプロセスになるため、IIS が他の要求を自由に処理できるようにしておきたいと思います。
AsyncController とバックグラウンド ワーカー
public ActionResult GetAudioCompleted(byte[] audio) { return File(audio, "audio/wav", "mywavfile.wav"); } public void GetAudioAsync() { BackgroundWorker w = new BackgroundWorker(); w.RunWorkerCompleted += (s, e) => { AsyncManager.Parameters["audio"] = e.Result; AsyncManager.OutstandingOperations.Decrement(); }; w.DoWork += (s, e) => { byte[] b; using (var ms = new MemoryStream()) { // Process audio to memory stream ms.Seek(0, SeekOrigin.Begin); b = new byte[ms.Length]; ms.Read(b, 0, (int)ms.Length); e.Result = b; } }; AsyncManager.OutstandingOperations.Increment(); w.RunWorkerAsync(); }
AsyncController & タスク
public ActionResult GetAudioCompleted(byte[] audio) { return File(audio, "audio/wav", "mywavfile.wav"); } public void GetAudioAsync() { AsyncManager.OutstandingOperations.Increment(); var t = Task<byte[]>.Factory.StartNew(() => { byte[] b; using (var ms = new MemoryStream()) { // Process audio to memory stream ms.Seek(0, SeekOrigin.Begin); b = new byte[ms.Length]; ms.Read(b, 0, (int)ms.Length); } return b; }) .ContinueWith(c => { AsyncManager.Parameters["audio"] = c.Result; AsyncManager.OutstandingOperations.Decrement(); }); }
非非同期コントローラーとスレッド
public ActionResult GetaAudio() { byte[] b; using (var ms = new MemoryStream()) { var t = Thread(() => { // Process audio to memory stream }); t.Start(); t.Join(); // error checking etc. ms.Seek(0, SeekOrigin.Begin); b = new byte[ms.Length]; ms.Read(b, 0, (int)ms.Length); return File(b, "audio/wav", "mywavfile.wav"); } }
質問:
- BackgroundWorkers は Web アプリケーションでの使用が推奨されていますか?
- タスクを使用する場合、このバックグラウンド スレッドは IIS スレッドプールからのものを使用しますか (スレッドが要求処理のために解放されないため、このアプローチの利点の 1 つが無効になる可能性があります)。
- System.Threading.Thread の使用 - このスレッドは IIS スレッドプールのいずれかを使用しますか。t.Join() は現在の IIS スレッドをブロックしますか?
どちらのアプローチがあなたにとってより良いと思われますか?またその理由は何ですか? 他のアプローチは大歓迎です。