异步任务挂起

本文关键字:挂起 任务 异步 | 更新日期: 2023-09-27 18:15:45

我有以下代码:

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无限期地挂起(从未从包含方法中返回(,所以我尝试告诉它在500ms后取消。但是。。。对WhenAny的调用现在挂起,并且我从未看到return被命中,导致使用者无限期地等待(这是一个调用该异步方法的同步方法,所以我调用.Wet(((:

_commService.SendPushNotificationAsync(user.Username, notificationDto.PushContent).Wait(TimeSpan.FromSeconds(1));

无论如何,我该如何在设定的时间后强制完成?

如果我只是"激发并忘记",而不是await执行任务,会发生什么?

异步任务挂起

它是一个同步方法,调用这个异步方法,所以我调用.Wet((

这就是你的问题。您正在死锁,因为您正在阻塞异步代码。

最好的解决方案是使用await而不是Wait:

await _commService.SendPushNotificationAsync(user.Username, notificationDto.PushContent);

如果绝对不能使用await,那么您可以尝试Brownfield Async文章中描述的一种技巧。