2017-05-11 8 views
1

50ミリ秒が経過したらタスクを終了します。タスクのステータスは「キャンセル済み」に設定し、それ以外の場合は「RunToCompletion」に設定する必要があります。タスクをキャンセルし、ステータスを「キャンセル済み」に設定します

タスクの作成はここにある:

CancellationTokenSource cts = new CancellationTokenSource(50); 
CancellationToken ct = cts.Token; 
Task test_task = Task.Run(async() => 
{ 
    try 
    { 
     tokenS.Token.Register(() => 
     { 
      cts.Cancel(); 
      ct.ThrowIfCancellationRequested(); 
     }); 
     await NotifyDevice(BLEDevice); 
    } 
    catch (Exception e) 
    { 
    } 
},ct); 

私は今まで得るすべてはtry/catch - ブロックで何とかcatchedませんAggregateException、です。

+0

あなたがしたいですかタスクは50ms後にキャンセルされるか、50ms後に操作がキャンセルされますか? –

+0

タスク "test_task"。手術の意味は? 'await NotifyDevice(BLEDevice)'は何ですか? – Laurence

+0

私は 'NotifyDevice'が50ms以上続くことを理解しています。 50ms後に 'test_task'がキャンセルされた場合でも実行し続けますか(簡単な解決法)? –

答えて

1

これはあなたに似た質問です:Is it possible to cancel a C# Task without a CancellationToken?。しかし、解決策は、NotifyDeviceメソッドのタスクをキャンセルしません。そのタスクは、基本となるタスクが取り消しをサポートしている場合にのみ取り消すことができます。そして、文書に基づいてI​Async​Infoをキャンセルすることができます。私は基本的なタスクをキャンセルすると、より多くの時間を要する場合、タスクは、ケースには50ミリ秒でキャンセルされていることを確認するためのラッパーとなるだろう:

CancellationTokenSource cts = new CancellationTokenSource(50); 
await NotifyDevice(BLEDevice, cts.Token).WithCancellation(cts.Token); 

EDIT:拡張メソッド自体:

public static async Task<T> WithCancellation<T>(this Task<T> task, CancellationToken cancellationToken) 
{ 
    var tcs = new TaskCompletionSource<bool>(); 
    using(cancellationToken.Register(s => ((TaskCompletionSource<bool>)s).TrySetResult(true), tcs)) 
     if (task != await Task.WhenAny(task, tcs.Task)) 
      throw new OperationCanceledException(cancellationToken); 
    return await task; 
} 
+0

非常に申し訳ありませんが、この拡張メソッドを私と一緒に使うことはできません。コンパイラはメソッドを認識しませんでしたか? – Laurence

+0

はい、プロジェクトのどこかに実装する必要があります。私はそれがそれを含むように私の答えを更新します。 –

+0

それは...コンパイラはまだ問題があるようだ... – Laurence

関連する問題