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の改善された新しいAPIを利用しています。

于 2012-10-31T04:15:38.237 に答える