どういうわけか、例外が実行されているメソッドによってキャッチされているようです。メソッドを呼び出すコードは次のとおりです。ご覧のとおり、タイムアウト付きのキャンセル トークンを作成します。キャンセル トークンが発生したときに呼び出すメソッドを登録してから、新しいタスクを開始します。キャンセル トークンは正常に機能しているようです。登録されたメソッドも同様です。
var cancellationToken = new CancellationTokenSource(subscriber.TimeToExpire).Token;
cancellationToken.Register(() =>
{
subscriber.Abort();
});
var task = Task<bool>.Factory.StartNew(() =>
{
subscriber.RunAsync((T)messagePacket.Body, cancellationToken);
return true;
})
.ContinueWith(anticedant =>
{
if (anticedant.IsCanceled)
{
Counter.Increment(12);
Trace.WriteLine("Request was canceled");
}
if (anticedant.IsFaulted)
{
Counter.Increment(13);
Trace.WriteLine("Request was canceled");
}
if (anticedant.IsCompleted)
{
Counter.Increment(14);
}
次のコードは、例外をスローするだけでなく、例外をキャッチしているように見えるメソッドです。
public async override Task<bool> ProcessAsync(Message input, CancellationToken cancellationToken)
{
Random r = new Random();
Thread.Sleep(r.Next(90, 110));
cancellationToken.ThrowIfCancellationRequested();
return await DoSomethingAsync(input);
}
キャンセルトークンによって例外がスローされていますが、intellitrace によると、メソッドの最後でキャッチされています。独自の例外をスローするなど、さまざまなオプションを試しましたが、 continuewith 関数が常に IsComleted を実行するか、完了コードまで実行されます。私が間違っていることについてのアイデアはありますか? ありがとう