2

我们有一棵树,当用户点击任何节点时,它会从 Web 服务中查询数据,并替换结果。但是,有时需要时间。所以我尝试将 Web 服务调用包装在一个任务中。我想在任务尚未完成并且用户单击其他节点时取消任务。以下是我的示例代码。然而取消任务块不能被执行,即使 _cancelTokenSource.Cancel() 执行。MSDN 提供的大多数示例都是基于 CPU 限制的,而不是 I/O 限制的。谁能告诉我如何全部取消网络服务?提前致谢

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);

}

4

1 回答 1

0

CancellationTokenSource它的令牌是一个线程(或任务)查询另一个线程是否请求任务取消的一种方式。当然,这需要您编写检查该令牌的代码(因此至少运行一次,通常是定期运行)。如果您已委托某些生成的代码(Web 服务代理)对任务或取消令牌一无所知,那么您将无法使用它。

如果您使用 Begin 方法开始调用,那么您可以使用WebClientAsyncResult.Abort()来中止调用。例如:

IAsyncResult ar = obj.BeginFunCall(5,5,null,null);
//...
if (!ar.IsCompleted) //if the request is not completed  { 
  WebClientAsyncResult wcar = (WebClientAsyncResult)ar;
  wcar.Abort();//abort the call to web service 
}
于 2012-08-13T14:22:30.093 回答