Microsoft.Azure.NotificationHub - 同步方法中的异步调用

时间:2016-10-10 09:02:25

标签: c# async-await task azure-mobile-services

我目前必须在我的API中提供同步作为异步方法:请在下面找到代码。唯一的问题是我没有 后端的sync方法。我使用Azure.NotificationHub客户端。该客户端只有* Async方法。我的方式合理吗?

    public PushHubNotificationResult SendPushMessage(string userId, string message)
    {
        PushHubNotificationResult result = new PushHubNotificationResult(); 
        try
        {
            result = SendPushMessageAsync(userId, message).GetAwaiter().GetResult();

        } catch (Exception ex)
        {
            result.Status = PushHubNotificationResultType.Error;
            result.Error = ex.Message;
            result.Exception = ex;
        }

        return result;
    }

    public async Task<PushHubNotificationResult> SendPushMessageAsync(string userId, string message)
    {
        PushHubNotificationResult result = new PushHubNotificationResult();

        // EnableTestSend see: https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-push-notification-fixer/#self-diagnose-tips

        // Create a new Notification Hub client.
        Microsoft.Azure.NotificationHubs.NotificationHubClient hub =
            Microsoft.Azure.NotificationHubs.NotificationHubClient.CreateClientFromConnectionString(NotificationHub, NotificationHubName);

        // Sending the message so that all template registrations that contain "messageParam"
        // will receive the notifications. This includes APNS, GCM, WNS, and MPNS template registrations.
        Dictionary<string, string> templateParams = new Dictionary<string, string>();

        templateParams["messageParam"] = message;

        string userTag = "_UserId:" + userId; // That line sets the IMEI or SerialNo (WLAN only device) == userId to which the push message is sent

        try
        {
            // Send the push notification and log the results.
            NotificationOutcome outcome = await hub.SendTemplateNotificationAsync(templateParams, userTag);

            result.Status = PushHubNotificationResultType.Success;

            foreach (RegistrationResult hubResult in outcome.Results)
            {
                result.PushNotificationHub = hubResult.ApplicationPlatform;
                result.RegistrationId = hubResult.RegistrationId;
                result.Outcome = hubResult.Outcome;
            }

        }
        catch (System.Exception ex)
        {
            result.Status = PushHubNotificationResultType.Error;
            result.Error = ex.Message;
            result.Exception = ex;
        }

        return result;
    }

感谢任何建议, 埃里克

1 个答案:

答案 0 :(得分:1)

如果您想使用同步异步,那么在ConfigureAwait(false)代码中使用async非常重要,否则您很可能会陷入僵局。

NotificationOutcome outcome =
    await hub.SendTemplateNotificationAsync(templateParams, userTag).ConfigureAwait(false);

异步方法已将异常转换为PushHubNotificationResultType.Error,为什么同步版本也会这样做?

相关问题