繁体   English   中英

ASP:在服务器端触发操作并返回

[英]ASP : trigger action server-side and return

我需要做一些上传后处理。

用户上传的.zip文件包含很多图片(通常在100到500之间)。 我需要处理该zip文件以提取,修改和存储图像。

我的问题是此后处理时间有点长,因此用户分配的HTTP错误500很大,因为分配给处理该请求的时间已结束。

实际过程:

  1. 用户上传zip文件
  2. 服务器拥有文件后,处理每个图像
  3. 等待并返回HTTP 200

我想进行异步后处理:

  1. 用户上传zip文件
  2. 服务器拥有文件后,触发后处理异步方法
  3. 不要等待并返回HTTP 200

可能吗 ? 有更好的方法吗?

注意:没有代码,因为那只是关于架构的问题

只需在另一个线程中执行您的后处理即可。

您可以使用

Task.Factory.StartNew(() => 
{ 
   /*your post-processing code*/ 
   //...etc
   /*when finished, notify user that post-processing has finished, maybe by email*/
});

最好不要让所有请求都创建新线程。 如果有大量并发用户,这将是非常糟糕的。 而是创建一个单独的“工作线程”,该线程一个接一个地执行“排队任务”。

所以你可以:

private class ProcessItem
{
   //define each task data
}

private static readonly ConcurrentQueue<ProcessItem> queue 
                                      = new ConcurrentQueue<ProcessItem>();

private static Thread worker = new Thread(() =>
{
    while (true) // infinite
    {
        ProcessItem item;
        if (!queue.TryDequeue(out item))
        { //no availble items, wait for an item
           Monitor.Enter(queue); Monitor.Wait(queue); Monitor.Exit(queue);
          continue; //I have been notified, repeat check
        }
        //now process item
    }
});

static YourClass()
{
     worker.Start(); //start the worker at class first-load
}

要将项目添加到队列中:

queue.Enqueue(item);
Monitor.Enter(queue); 
Monitor.PulseAll(queue); //notifiy the waiting threads
Monitor.Exit(queue);

我认为最好的方法不是使用Async,因为您可能会从主线程池中借用一个线程,这意味着您的服务器可用于处理其他请求的线程较少。 现在,假设您在1-2秒内上传了20个zip文件,那么您将从线程池中借用20个甚至更多线程来处理您的zip文件,这意味着您的服务器在那时可以减少20个请求。

最好的方法是启动一个完全独立的后台进程/应用程序。 例如,您可能会。

  1. 用户上传zip文件。
  2. 将文件保存到某个位置,然后单击确定200从Web应用返回。
  3. 您的Web应用程序向数据库或某处的文件写入和指示(即某种记录),其中包含有关如何处理zip文件的说明。
  4. 某种应用程序,例如exe可以读取这些说明并处理zip文件,并将状态写回到数据库或其他内容。

希望这是有道理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM