16

Task.RunからHangfireに切り替えています。.NET 4.5+ では returnを返すことができるため、.NET 以外を返すタスクを実行できます。プロパティにアクセスすることで、通常は待機してタスクの結果を取得できますTask.RunTask<TResult>voidMyReturnedTask.Result

私の古いコードの例:

public void MyMainCode()
{
    List<string> listStr = new List<string>();
    listStr.Add("Bob");
    listStr.Add("Kate");
    listStr.Add("Yaz");

    List<Task<string>> listTasks = new List<Task<string>>();

    foreach(string str in listStr)
    {
        Task<string> returnedTask = Task.Run(() => GetMyString(str));
        listTasks.Add(returnedTask);
    }

    foreach(Task<string> task in listTasks)
    {
        // using task.Result will cause the code to wait for the task if not yet finished.
        // Alternatively, you can use Task.WaitAll(listTasks.ToArray()) to wait for all tasks in the list to finish.
        MyTextBox.Text += task.Result + Environment.NewLine;
    }
}
private string GetMyString(string str)
{
    // long execution in order to calculate the returned string
    return str + "_finished";
}

Hangfireのクイック スタートページからわかる限りBackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget")); 、バックグラウンド ジョブとしてコードを完全に実行しているあなたの主な担当者は、明らかに戻り値を持つジョブをサポートしていません (上記のコードのように)。そうですか?そうでない場合、Hangfire を使用するためにコードを微調整するにはどうすればよいですか?

PS私はすでに見ましたHostingEnvironment.QueueBackgroundWorkItemこちら)が、明らかに同じ機能が欠けています(バックグラウンドジョブはそうでなければなりませんvoid

編集

@Dejan が理解したように、私が Hangfire に切り替えたい主な理由は、.NET の人々QueueBackgroundWorkItemが .NET 4.5.2 で追加したのと同じ理由です。その理由は、ASP.NET のバックグラウンド タスクに関するScott Hanselman の優れた記事で詳しく説明されています。というわけで記事から引用します。

QBWI (QueueBackgroundWorkItem) は、リクエストに関係なく、バックグラウンドで実行できるタスクをスケジュールします。これは、ASP.NET がこの API を通じて登録された現在実行中の作業項目の数を自動的に追跡し、ASP.NET ランタイムがこれらの作業項目の実行が完了するまで AppDomain のシャットダウンを遅らせようとするという点で、通常の ThreadPool 作業項目とは異なります。

4

1 に答える 1