Майкрософт.Azure.NotificationHub — асинхронный вызов в методе синхронизации

#c# #async-await #task #azure-mobile-services

#c# #асинхронный -ожидание #задача #azure-мобильные службы

Вопрос:

В настоящее время я должен предоставить метод синхронизации как асинхронный в моем API: пожалуйста, найдите код ниже. Единственная проблема заключается в том, что у меня нет метода синхронизации в серверной части. Я использую Azure.Клиент NotificationHub. У этого клиента есть только * Асинхронные методы. Является ли мой способ разумным?

     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 resu<
    }

    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 resu<
    }
  

спасибо за любой совет,
Эрик

Ответ №1:

Если вы хотите использовать sync-over-async, очень важно, чтобы вы использовали его ConfigureAwait(false) в своем async коде, иначе вы, скорее всего, получите взаимоблокировку.

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

Метод async уже преобразует исключения в PushHubNotificationResultType.Error , почему версия синхронизации тоже это делает?