HostingEnvironment.QueueBackgroundWorkItem
のシグネチャは次のとおりです。
public static void QueueBackgroundWorkItem(Action<CancellationToken> workItem)
これは、作業項目がCancellationToken
へのアクセスを得ることを意味します。しかし、私はそれがあなたの場合に有用だとは思わない。 the documentation:
提供されているCancellationTokenは、アプリケーションのシャットダウン時に通知されます。
あなたには、いくつかの他の条件に基づいてworkItem
をキャンセルしたい場合は、あなたがCancellationTokenSource
から作成した別のCancellationToken
を、使用することができます。それは10秒以内に起動しない場合たとえば、作業項目をキャンセルします
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
HostingEnvironment.QueueBackgroundWorkItem(_ =>
{
cts.Token.ThrowIfCancellationRequested();
// the code of the work item goes here
});
これは技術的にはまだCancellationToken
がキャンセルされた場合でも、作業項目を開始しますが、それは何もしません。
キャンセルは常に協力的であることに注意してください。つまり、実行中の作業項目があり、その実行中にキャンセルする場合は、定期的にCancellationToken
をチェックする必要があります。
キャンセルするには、別の「タスク」でコードを実行する必要はありません。 – svick
他のオーバーロードを使用すると、シーンの後ろにタスクが作成されます。リンクされたトークンソースを作成することで、私は1つのcancallationトークンだけを管理する必要があります。 Ref:https://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource.createlinkedtokensource(v=vs.110).aspx "CancellationTokenSourceを作成します。キャンセルされた状態になるのは、ソーストークンはキャンセルされた状態になります。 – maxlego
[そこに作成された「タスク」はありません](http://referencesource.microsoft.com/#System.Web/Hosting/HostingEnvironment.cs,32c143ca4ed232c1)コードが実際に実行されます)。そして、キャンセルする2つの方法を組み合わせたいのであれば、 'CreateLinkedTokenSource()'は正しい解決策です。私はそれに対して何も言いませんでした。 – svick