この質問にはすでに答えがあります。
私は毎分システム内のさまざまなものを監視する必要があるWindowsサービスを持っています(WCFサービスへの接続、データの送信など)。
そのために、私は以下のように見えるQuartz.NETジョブを使うことを選びました:
internal class MonitorLaunchJob : IJob
{
public void Execute(IJobExecutionContext context)
{
MonitorBase[] monitors = GetAllMonitors();
foreach (var monitor in monitors)
var task = monitor.Launch();
}
}
monitor.Launch
次のシグネチャを持つメソッドです。
public abstract Task Launch()
このメソッドをオーバーライドすると、次のような長時間の操作が使用される場合がありますawait TcpClient.ConnectAsync()
そしてそのようなもの。これらの方法は多くのログ記録を使用して自分自身でアクティビティを追跡するので、私は追跡する必要はありません。Task
によって返されたmonitor.Start()
。ただ発砲して忘れる必要があります。
今、私の質問です:私はこれで何をしますかtask
それLaunch
メソッドが戻りますか?それは火と忘れの操作なので、どこにでも保存する理由は考えられません。しかし、その一方で、メソッドがオブジェクトを返す場合、それを単に無視するのは奇妙です。次のような場合は、何らかのクリーンアップをする必要がありますかtask
完成されました?タスクをそのままにしてその状態を追跡しない場合、パフォーマンス上の問題に直面するでしょうか。
ここで言ったようにhttps://blogs.msdn.microsoft.com/pfxteam/2012/03/25/do-i-need-to-dispose-of-tasks/短い答えは「いいえ。あなたの仕事を邪魔しないでください」です。
またここに良い情報:タスクを破棄する必要がありますか?
Task
オブジェクトとは、タスクの状態を監視できなくなることを意味します。これには、タスクで発生した例外を観察できないことも含まれます。これらの制限はあなたにとって問題であるかもしれないしそうでないかもしれません。タスクをクリーンアップしないことの意味についてのより包括的な説明については、マークされた複製を参照してください。 - Peter Duniho