2015-10-14 175 views
-1

I'we得到了與取消標記異步控制器操作作爲參數:取消兒童任務時如何取消父母任務?

public async Task<ActionResult> Index(string NomenCode = "", string ProducerName = "", bool? WithAnalog = null, long? OrderId = null, CancellationToken cancelToken = default(CancellationToken)) 
     { 
// .. some code 

// my async method gets this token 
await SearchModel.GetRemains(search, NomenCode, ProducerName, _WithAnalog,  this.HttpContext, cancelToken); 

//.. more code 
} 

SearchModel.GetRemains方法調用3種其他異步方法(網絡服務),當其中一人獲得由超時被取消,其他都是不執行。

在這3個Web服務的每一箇中,我也以異步方式連接到數據庫。當第三方的async子方法出錯時,如何使我的async任務中的2個能夠正常工作?

我將取消標記參數從父方法傳遞給所有async方法。

如果我不想要一個子動作影響我的父動作的執行呢?但是,如果父母被取消了,那麼就要把它拆掉?我該怎麼辦?

感謝您的關注和幫助

+0

這三個異步方法在哪裏被調用? –

+0

裏面的某個地方SearchModel.GetRemains() –

+0

List > tasks = new List >(); 任務 t = new SearchMethodEmex()。GetResult(searchParam); tasks.Add(t); 任務 t = new SearchMethodStells()。GetResult(searchParam); tasks.Add(t); 任務 t = new SearchMethodMikado()。GetResult(searchParam); tasks.Add(t); 等待this.HandleTasks(任務,cToken).ConfigureAwait(false); –

回答

1

我怎樣才能讓我的異步任務2工作時,第三人的異步子方法獲取錯誤?

當某個任務被取消或者完成時出現錯誤(例如超時),那麼該任務將引發異常。

爲了避免傳播外,只要使用try/catch

try 
{ 
    await SearchModel.GetRemains(search, NomenCode, ProducerName, _WithAnalog,  this.HttpContext, cancelToken); 
} 
catch (MyExpectedException) 
{ 
    ... 
} 

但希望它cancell如果父母被取消?

您已經通過父母的CancellationToken下來,所以這已被照顧。父母及其所有孩子共享相同的取消標記。