Asp.net mvc 3 Pro';MVC 3后台处理的优缺点

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

我需要在MVC3应用程序中进行一些音频处理,并想知道不同背景方法的优缺点。 音频处理通常是一个长时间运行的过程,所以我只想确保IIS可以自由处理其他请求

  • 异步控制器和后台工作程序

    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();
            });          
    }
    
  • 问题:

  • 是否建议在web应用程序中使用BackgroundWorker
  • 如果我使用任务,这个后台线程是否使用IIS线程池中的任务(可能会否定这种方法的一个好处,因为线程没有被释放用于请求处理)
  • 使用System.Threading.Thread-此线程是否使用IIS线程池中的线程。t.Join()是否阻止当前IIS线程 你觉得哪种方法更好?为什么?欢迎任何其他方法

  • 否。ASP.NET和IIS在各自的线程上执行每个HTTP请求/响应。ASP.NET中的异步编程更多的是针对每个请求执行更多的工作(例如在单独的线程上执行不相关的SQL查询),而不是处理请求的线程

  • 我不知道,我对任务不太熟悉

  • 对,对

  • 我会这样做(伪代码):

  • 我会先处理文件,然后在后台线程中处理(使用简单的
    System.Threading.thread
    实例),这意味着IIS请求/响应线程不会被阻止,可以立即将HTML返回给客户端
  • 我会将令牌或引用存储在此文件处理作业的某处。然后,我将返回一个303重定向到“/processingJobs/job123”(其中job123是作业ID)
  • 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");
        }
    }