异步任务挂起

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.

中描述的一种技巧