例外在Task.Run包裹方法没有被捕获(Exception not caught in Task.

2019-09-28 19:30发布

新来异步等待整合在C#5,我和一些基本的任务为基础的方法努力探索异步等待和TPL。 在这个例子中下面我打电话以5秒的超时的Web服务。 如果超时就应该抛出一个异常,所以我可以从该方法返回false。 然而,超时永远不会发生,也许它的确但任务不会返回。

public static Task<bool> IsConnectedAsync()
{
    return Task.Run(() =>
    {
        try
        {
            using (WSAppService.AppService svc = new NCSoftware.Common.WSAppService.AppService(GetServiceUrl(WebService.app)){Timeout = 5000})
            {
                return svc.PingB();
            }
        }
        catch (Exception ex)
        {
            Logger.LogException(ex.Message, ex, "IsConnectedAsync");
        }    
        return false;
    });
}

如果你能请如何妥善处理这一因此,如果发生超时,甚至更好,发生异常时,任务不会返回帮助。

Answer 1:

一般情况下,你不应该使用Task.Run如果你包裹async服务。 由于这是一个服务引用,你应该能够暴露的async方法(返回Task直接从服务,在这种情况下,你可以使用):

public async static Task<bool> IsConnectedAsync()
{
    try
    {
         using (WSAppService.AppService svc = new NCSoftware.Common.WSAppService.AppService(GetServiceUrl(WebService.app)){Timeout = 5000})
         {
              return await svc.PingBAsync();
         }
     }
     catch (Exception ex)
     {
         Logger.LogException(ex.Message, ex, "IsConnectedAsync");
     }    
     return false;
}

如果你必须通过包裹Task.Run (再次,这是不建议的,因为它是通过线程池,这通常是更好地在顶层用户办理转同步代码到异步),你可以这样做:

public async static Task<bool> IsConnectedAsync()
{
    try
    {
       return await Task.Run(() =>
       {
         using (WSAppService.AppService svc = new NCSoftware.Common.WSAppService.AppService(GetServiceUrl(WebService.app)){Timeout = 5000})
         {
              return svc.PingB();
         }
       }
     }
     catch (Exception ex)
     {
         Logger.LogException(ex.Message, ex, "IsConnectedAsync");
         return false;
     }    
}


文章来源: Exception not caught in Task.Run wrapped method