我有一个简单的应用程序来处理从表单提交的文件。我正在尝试使用下面列出的代码异步运行文件处理。
不幸的是,在长时间运行StaticProcessingMethod
之后,会返回http响应。
在提交时异步处理文件的正确方法是什么?
public override object OnPost(Item item)
{
System.ComponentModel.BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
worker.DoWork += new System.ComponentModel.DoWorkEventHandler(
delegate(object o, System.ComponentModel.DoWorkEventArgs args)
{
StaticProcessingMethod(base.RequestContext.Files[0].InputStream);
});
worker.RunWorkerAsync();
return new HttpResult("Processing started", ContentType.PlainText + ContentType.Utf8Suffix);
}
答案 0 :(得分:1)
我会将一个后台线程包装并作为依赖项注入,它只是排队需要处理的任务列表。例如类似的东西:
public IBackgroundProcessor BackgroundProcessor { get; set; }
public object Post(Item item)
{
BackgroundProcessor.Enqueue(
new StaticProcessingTask(item, base.RequestContext.Files[0].InputStream));
return new HttpResult("Processing started",
ContentType.PlainText + ContentType.Utf8Suffix);
}
后台线程在AppHost中启动。排队任务会将其排入并发队列并通知/唤醒后台休眠线程,否则如果bg线程仍在运行,它将在处理完所有待处理任务后进入休眠状态。
注意:上面的示例代码使用ServiceStack's improved New API。