我有以下代码:
public async Task SendPushNotificationAsync(string username, string message)
{
var task = ApnsNotifications.Instance.Hub.SendAppleNativeNotificationAsync(alert, username);
if (await Task.WhenAny(task, Task.Delay(500)) == task) {
return true;
}
return false;
}我注意到SendAppleNativeNotificationAsync是无限期挂起的(从未从包含的方法中返回),所以我试着让它在500 to后取消。但还是..。对WhenAny的调用现在挂起了,而且我从未见过return被击中,结果消费者只是无限期地等待(这是一个调用这个异步方法的同步方法,所以我调用.Wait()):
_commService.SendPushNotificationAsync(user.Username, notificationDto.PushContent).Wait(TimeSpan.FromSeconds(1));无论如何,我怎样才能在规定的时间后才能完成这个任务呢?
如果我只是“触发并忘记”,而不是await处理任务,会发生什么?
发布于 2016-11-01 16:16:03
它是一个调用异步方法的同步方法,所以我调用.Wait()
这就是你的问题。你是死锁是因为您阻塞了异步代码。
最好的解决方案是使用await而不是Wait。
await _commService.SendPushNotificationAsync(user.Username, notificationDto.PushContent);如果您绝对不能使用await,那么您可以尝试使用my Brownfield异步文章中描述的其中一个黑客。
https://stackoverflow.com/questions/40363918
复制相似问题