CancellationTokenSource
を使用してください。ソースはCancellationTokens
の工場です。あなたはきちんとした方法でその処理を取り消すことができるようにしたいすべての人にこのトークンを渡します。 CancellationToken
があるすべてのプロセスを同じCancellationTokenSource
から取り消したい場合は、CancellationTokenSource
にすべてのプロセスにキャンセルを送信し、このソースからのトークンを持つすべてのプロセスをキャンセルしてください。
また、CancellationTokenSource
にはCancelAfter(some timeout)
があります。
あなたのプロセスのスターターがcancelationTokenを与えるようにして、プロセスの初心者が1回の呼び出しでキャンセルしたいプロセスを決定できるようにすることをお勧めします。
public async Task<MyResult> MyProcessAsync(CancellationToken cancellationToken, ...)
{
// do something lengthy processing, without await, regularly check if Cancellation requested
while (stillProcessing)
{
cancellationToken.ThrowIfCancellationRequested();
... // process
}
// do some processing with async-await:
await myDbContext.SaveChangesAsync(cancellationToken);
}
使用法:一つだけCancelltionTokenSourceが使用されている
private async Task LengthyProcessing(...)
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
tokenSource.CancelAfter(TimeSpan.FromSeconds(5));
CancellationToken myCancellationToken = tokenSource.Token
try
{
// Start one task, don't await yet:
var myTask = await MyProcessAsync(myCancellationToken, ...)
// during processing there will be regular check if cancellation requested
// meanwhile, whenever myTask has to await, I can do some processing
// I'll have to check for cancellation regularly also:
while(...)
{
myCancellationToken.ThrowIfCancellationRequested();
DoSomeProcessing();
...
}
MyResult result = await myTask;
// if here, not cancelled. can use Result:
ProcessResult(result);
}
catch (OperationCanceledException exc)
{
ProcessOperationCanceled();
}
}
注意。このソースが何かをキャンセルする必要があると考えるたびに、このソースからのトークンを持つすべてのスレッドにcancellationrequestについての通知が送られます。
CancellationToken.ThrowIfCancellationRequested()
で例外処理を使用する代わりに、bool CancellationToken.IsCancellationRequested
を使用することを検討してください。あなたが強制的にアプリの外にクラッシュしようとしている場合を除き
MSDN how to cancel a task and its children
史上かつて 'Thread.Abortを()'を呼び出すことはありませんしてください。アボートを呼び出すと、実行中の.NETの状態が破損し、他のすべてのスレッド**の結果が信頼できなくなります。 – Enigmativity