异步任务挂起
Async task hanging
我有以下代码:
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 毫秒后取消。但是仍然......对 WhenAny
的调用现在挂起并且我从未看到 return
被击中,导致消费者无限期地等待(这是一个调用此异步方法的同步方法,所以我调用 .Wait ()):
_commService.SendPushNotificationAsync(user.Username, notificationDto.PushContent).Wait(TimeSpan.FromSeconds(1));
无论如何,我如何强制它在设定的时间后完成?
如果我只是 "fire and forget" 而不是 await
执行任务会怎样?
it's a sync method calling this async method, so I call .Wait()
那是你的问题。你 deadlocking because you're blocking on asynchronous code.
最好的解决方案是使用 await
而不是 Wait
:
await _commService.SendPushNotificationAsync(user.Username, notificationDto.PushContent);
如果您绝对不能使用await
,那么您可以尝试我的Brownfield Async article.
中描述的一种技巧
我有以下代码:
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 毫秒后取消。但是仍然......对 WhenAny
的调用现在挂起并且我从未看到 return
被击中,导致消费者无限期地等待(这是一个调用此异步方法的同步方法,所以我调用 .Wait ()):
_commService.SendPushNotificationAsync(user.Username, notificationDto.PushContent).Wait(TimeSpan.FromSeconds(1));
无论如何,我如何强制它在设定的时间后完成?
如果我只是 "fire and forget" 而不是 await
执行任务会怎样?
it's a sync method calling this async method, so I call .Wait()
那是你的问题。你 deadlocking because you're blocking on asynchronous code.
最好的解决方案是使用 await
而不是 Wait
:
await _commService.SendPushNotificationAsync(user.Username, notificationDto.PushContent);
如果您绝对不能使用await
,那么您可以尝试我的Brownfield Async article.