首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASP :触发动作服务器端并返回

ASP :触发动作服务器端并返回
EN

Stack Overflow用户
提问于 2016-01-13 11:28:12
回答 2查看 84关注 0票数 0

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

用户上传包含大量图像的.zip (通常在100到500之间)。我需要处理这个压缩文件来提取、修改和存储图像。

我的问题是,这个后处理有点长,所以用户会得到一个HTTP错误500,因为分配给处理请求的时间已经结束。

实际过程:

  1. 用户上传压缩文件
  2. 一旦服务器有了文件,就处理每个映像。
  3. 等待并返回HTTP200

我希望有一个异步的后处理:

  1. 用户上传压缩文件
  2. 一旦服务器拥有该文件,就触发后处理异步方法。
  3. 不要等待并返回HTTP200

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

注:没有代码,因为这只是一个关于建筑的问题

EN

Stack Overflow用户

回答已采纳

发布于 2016-01-13 11:30:16

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

你可以用

代码语言:javascript
复制
Task.Factory.StartNew(() => 
{ 
   /*your post-processing code*/ 
   //...etc
   /*when finished, notify user that post-processing has finished, maybe by email*/
});

最好不要让所有请求都创建新线程。对于很多并发用户来说,这将是非常糟糕的。而是创建一个"worker“线程,逐个执行”排队任务“。

所以你可以:

代码语言:javascript
复制
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
}

若要将项添加到队列中,请执行以下操作:

代码语言:javascript
复制
queue.Enqueue(item);
Monitor.Enter(queue); 
Monitor.PulseAll(queue); //notifiy the waiting threads
Monitor.Exit(queue);
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34765487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档