我需要在 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(); }
异步控制器和任务
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 线程池中的一个(可能会否定这种方法的好处之一,因为线程没有被释放用于请求处理)?
- 使用 System.Threading.Thread - 此线程是否使用 IIS 线程池中的一个。t.Join() 会阻塞当前的 IIS 线程吗?
哪种方法对您来说似乎更好,为什么?欢迎任何其他方法。