ツリーがあり、ユーザーが任意のノードをクリックすると、Web サービスからデータを照会し、結果を置き換えます。ただし、時間がかかる場合もあります。そこで、Web サービス呼び出しをタスクにラップしようとしました。タスクが完了していないときにタスクをキャンセルし、ユーザーが他のノードをクリックしたいと思います。以下は私のサンプルコードです。ただし、_cancelTokenSource.Cancel() が実行されても、キャンセル タスク ブロックは実行できません。MSDN が提供するサンプルのほとんどは、I/O バウンドではなく、CPU バウンドに基づいています。Webサービスをすべてキャンセルする方法を誰か教えてもらえますか? 前もって感謝します
private void OnNodeClicked(int id)
{
if (_cancelTokenSource != null)
_cancelTokenSource.Cancel();
IsRunning = true;
var uiSchedule = System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext();
_cancelTokenSource = new CancellationTokenSource();
var loadDataTask = System.Threading.Tasks.Task.Factory.StartNew<int[]>(() =>
{
// Call web service here
}, _cancelTokenSource.Token);
loadDataTask.ContinueWith((result) =>
{
// Populate data
IsRunning = false;
}, CancellationToken.None, System.Threading.Tasks.TaskContinuationOptions.OnlyOnRanToCompletion, uiSchedule);
loadDataTask.ContinueWith((result) =>
{
// set cancel state here
IsRunning = false;
}, CancellationToken.None, System.Threading.Tasks.TaskContinuationOptions.OnlyOnCanceled, uiSchedule);
}