新来异步等待整合在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;
});
}
如果你能请如何妥善处理这一因此,如果发生超时,甚至更好,发生异常时,任务不会返回帮助。
一般情况下,你不应该使用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;
}
}