我需要在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();
});
}
非异步控制器&amp;螺纹
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");
}
}
问题:
哪种方法对您来说似乎更好?为什么?欢迎任何其他方法。
答案 0 :(得分:2)
没有。 ASP.NET和IIS在其自己的线程上执行每个HTTP请求/响应。 ASP.NET中的异步编程更多的是为每个请求执行更多工作(例如在不同的线程上执行不相关的SQL查询),而不是处理线程化请求。
我不知道,我对任务不太熟悉。
是的,是的。
我会这样做(伪代码):
System.Threading.Thread
实例),这意味着IIS请求/响应线程未被阻止并且可以将HTML返回给客户端立即GET processingJobs
的actionHandler将查找作业123的后台线程并查看它是否完整,如果未完成则会返回HTML响应,说明“您的作业正在处理中,请再次刷新页面更新状态“,以及每隔5-10秒刷新一次页面的小javascript。content-disposition:
标题的已处理音频文件。如果音频处理由单独的进程或队列系统处理而不是同时进行,则此技术可以很好地扩展,甚至无限扩展。
一般准则:如果在100毫秒内无法完成HTTP请求/响应,则在后台执行该作业并立即返回状态消息。