2012-08-13 29 views
2

我們有一棵樹,當用戶點擊任何節點時,它將查詢來自Web服務的數據,並取代結果。但是,有時需要時間。所以我嘗試將Web服務調用包裝在一個任務中。我想在任務尚未完成時取消任務,並且用戶單擊其他節點。以下是我的示例代碼。但是取消任務塊不能執行,即使執行了_cancelTokenSource.Cancel()。 MSDN提供的大多數樣本基於CPU綁定,而不是I/O綁定。任何人都可以告訴我如何取消所有的Web服務?在此先感謝如何取消任務內的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); 

}

回答

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 
}