Asp.net mvc 3 Pro';MVC 3后台处理的优缺点
我需要在MVC3应用程序中进行一些音频处理,并想知道不同背景方法的优缺点。 音频处理通常是一个长时间运行的过程,所以我只想确保IIS可以自由处理其他请求Asp.net mvc 3 Pro';MVC 3后台处理的优缺点,asp.net-mvc-3,task-parallel-library,backgroundworker,Asp.net Mvc 3,Task Parallel Library,Backgroundworker,我需要在MVC3应用程序中进行一些音频处理,并想知道不同背景方法的优缺点。 音频处理通常是一个长时间运行的过程,所以我只想确保IIS可以自由处理其他请求 异步控制器和后台工作程序 public ActionResult GetAudioCompleted(byte[] audio) { return File(audio, "audio/wav", "mywavfile.wav"); } public void GetAudioAsync() { Backgroun
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();
});
}
System.Threading.thread
实例),这意味着IIS请求/响应线程不会被阻止,可以立即将HTML返回给客户端GET processingJobs
的actionHandler将查找job 123的后台线程,查看它是否已完成,如果未完成,则返回一个HTML响应,说明“正在处理您的作业,请再次刷新页面以获取更新状态”,还有一点javascript,每5-10秒刷新一次页面内容处置:
标题一般指导原则:如果HTTP请求/响应无法在100毫秒内完成,则在后台执行该工作,并立即返回状态消息。我应该澄清“长时间运行的流程”。根据经验,音频处理将花费<5秒的时间。对于用户来说,这是一个可以接受的等待,所以我很高兴他们在请求完成之前不会收到请求的结果,但我不想在每个请求中阻止IIS这么长时间。谢谢您的回答~对于我们的用户来说,5秒的音频处理时间被认为是可以接受的等待时间,因此我们将选择选项2-AsyncController和TPL
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");
}
}