1

我不知道我应该如何正确地从一个任务到线程创建此任务传播异常:如何将任务/线程的异常传播到在c#中创建此任务的方法?

private void threadMT() 
{ 
    Task task; 
    try 
    { 
     task = new Task(() => 
     { 
      throw new Exception("blabla"); 
     }); 
     task.Start(); 

     while(!task.IsCompleted) 
      Thread.Sleep(500); 
     if (task.IsFaulted) 
      throw task.Exception; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

当达到该行:

throw new Exception("blabla"); 

应用程序停止说,异常不被处理。 它可以传播回方法吗?

Thx提前。

回答

1

供您在线程池执行的Task传播异常的最简单的办法就是把它实际返回一个Task您可以await上:

public async Task AwaitOnTaskAsync() 
{ 
    try 
    { 
     await DoStuffWithThreadAsync(); 
    } 
    catch (Exception e) 
    { 
    } 
} 

public Task DoStuffWithThreadAsync() 
{ 
    return Task.Run(() => { throw new Exception("blabla"); }); 
} 

await将确保解开Task之外的例外,允许您在其上应用try-catch

边注 - 不要使用Task构造函数,而是使用Task.Run来返回“热门任务”(已启动的任务)。有一个在创造一个Task您正在积极阻塞后面使用Thread.Sleep没有意义的,无论是同步执行,或使用异步等待异步等待任务。

+0

该代码仍会生成“未处理的异常”。 –

+0

你在VS中打开第一次机会例外吗? –

+0

如果我禁用VS选项中的CLR异常,则不会再有例外。 我不确定关闭此功能的所有后果吗? –

相关问题