如何在ServiceStack中的onPost方法中启动异步处理?

时间:2012-10-31 01:56:06

标签: c# asynchronous backgroundworker servicestack

我有一个简单的应用程序来处理从表单提交的文件。我正在尝试使用下面列出的代码异步运行文件处理。

不幸的是,在长时间运行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);
}

1 个答案:

答案 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