1

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;
    });
}

如果您可以帮助如何正确处理此问题,以便如果发生超时甚至更好,则发生异常,任务确实返回。

4

1 回答 1

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;
     }    
}
于 2013-08-09T18:10:40.307 回答