2015-10-14 100 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下来,所以这已被照顾。父母及其所有孩子共享相同的取消标记。