c# – 没有等待的任务异常处理
发布时间:2020-12-15 19:27:36 所属栏目:百科 来源:网络整理
导读:使用“任务”时,我不确定如何在不调用“等待”任务时如何处理.以下示例不在async方法中执行. 这是一个例子: var t = Task.Run(() ={ // do something as part of the task concurrently}); 将上面的整个块包装起来并捕获异常是正确的方法吗? 我知道我可以
使用“任务”时,我不确定如何在不调用“等待”任务时如何处理.以下示例不在async方法中执行.
这是一个例子: var t = Task.Run(() => { // do something as part of the task concurrently }); 将上面的整个块包装起来并捕获异常是正确的方法吗? 我知道我可以等待下面的任务结果并处理异常,但我的问题与上面的块有关而没有调用t.Wait. try { t.Wait(); } catch(AggregateException ae) { // handle exception(s) } 所以,我的问题是,当我不等待(或等待)任务时,这是否是处理异常的正确方法? try { var t = Task.Run(() => { // do something as part of the task concurrently }); } catch(Exception ex) //NOTE general Exception { // show exception in message box or log it somewhere } UPDATE1 var t = Task.Run( () => { try { // do something as part of the task concurrently } catch(Exception ex) //NOTE general Exception { // show exception in message box or log it somewhere } }); 解决方法
您提供的代码(编辑后)将无法帮助您处理任务中抛出的错误.它只会捕获主代码块中抛出的异常,例如在调度任务或获取传递给它的参数时.
Async / Await简化异步任务控制流程 如果您使用的是C#5及更高版本(与VS2013捆绑在一起),最简单的方法是使用async / await,这简化了异步任务的控制流程: public async Task DoSomething() { try { DoSyncWork(); await Task.Run(() => AsyncStuff()); } catch (Exception ex) { // handle. } } 编译器将自动解构异步任务并将异常返回到正常的catch块 – 无论代码的同步或异步部分是否引发了异常. OnlyOnFaulted继续处理任务异常 如果您没有使用C#5,或者不想使用async / await(因为您正在处理并行性,而不仅仅是异步),那么该技术是使用Task.ContinueWith在出现错误时指定延续: var task = Task.Run(() => Whatever()) .ContinueWith(failedTask => HandleError(failedTask),TaskContinuationOptions.OnlyOnFaulted); 这将导致在原始任务完成后继续启动,但仅在它引发异常时才会启动.您可以使用它根据结果指定多个延续分支: var baseTask = Task.Run(() => Whatever()); baseTask.ContinueWith(failedTask => HandleError(failedTask),TaskContinuationOptions.OnlyOnFaulted); baseTask.ContinueWith(successfulTask => HandleResults(successfulTask),TaskContinuationOptions.OnlyOnRanToCompletion); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |