[英]ASP : trigger action server-side and return
我需要做一些上传后处理。
用户上传的.zip文件包含很多图片(通常在100到500之间)。 我需要处理该zip文件以提取,修改和存储图像。
我的问题是此后处理时间有点长,因此用户分配的HTTP错误500很大,因为分配给处理该请求的时间已结束。
实际过程:
我想进行异步后处理:
可能吗 ? 有更好的方法吗?
注意:没有代码,因为那只是关于架构的问题
只需在另一个线程中执行您的后处理即可。
您可以使用
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个请求。
最好的方法是启动一个完全独立的后台进程/应用程序。 例如,您可能会。
希望这是有道理的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.