1

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

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

1 回答 1

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 改进的 New API

于 2012-10-31T04:15:38.237 回答