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 作業項目とは異なります。