Асинхронный обработчик UWP CommunityToolkit Messenger

ИТНОА

Привет,

У меня есть проект UWP , и я хочу передавать сообщения между иViewс помощью CommunityToolkit MVVM Toolkit.

Как вы можете видеть в моемViewModelу нас есть что-то вроде ниже

              private async void CallbackClick()
        {
            while (true)
            {
                CallbackDto callback = callbackQueue.Pop();
                if (callback is null)
                    break;

                callbackQueue.Push(new CallbackDto(callback.Number, DateTimeOffset.UtcNow.ToUnixTimeSeconds()));
                string normalizedAddress = callback.Number;
                BSN.LinphoneSDK.Call outgoingCall = await LinphoneManager.Instance.NewOutgoingCall($"{normalizedAddress}");
                await outgoingCall.WhenEnded();
                // TODO: It is mandatory for backing to Dialer from InCall, but it is very bugous and must fix it
                await Task.Delay(1000);
                Task<CancellationToken> cancellationTokenTask = WeakReferenceMessenger.Default.Send<ContinueCallbackAnsweringRequestMessage>();
                CancellationToken cancellationToken = await cancellationTokenTask;
                if (cancellationToken.IsCancellationRequested)
                    break;
            }
        }

И я должен зарегистрироваться на сообщение вDialer.xaml.csвNavigatedToкак ниже

       WeakReferenceMessenger.Default.Register<ContinueCallbackAnsweringRequestMessage>(this, async (r, message) =>
            {
                var continueCallbackAnsweringDialog = new MessageDialog("آیا مایل به ادامه پاسخ‌دهی به تماس‌های درخواستی هستید؟");
                TaskCompletionSource<CancellationToken> tcs = new TaskCompletionSource<CancellationToken>(TaskCreationOptions.RunContinuationsAsynchronously);
                continueCallbackAnsweringDialog.Commands.Add(new UICommand(
                    "بلی",
                    new UICommandInvokedHandler((IUICommand command) =>
                    {
                        tcs.SetResult(new CancellationToken(false));
                    })));
                continueCallbackAnsweringDialog.Commands.Add(new UICommand(
                    "خیر",
                    new UICommandInvokedHandler((IUICommand command) =>
                    {
                        tcs.SetResult(new CancellationToken(true));
                    })));
                continueCallbackAnsweringDialog.DefaultCommandIndex = 0;
                continueCallbackAnsweringDialog.CancelCommandIndex = 1;
                await continueCallbackAnsweringDialog.ShowAsync();

                message.Reply(tcs.Task);
            });

В этом сценарии я получилInvalidOperationExceptionнаWeakReferenceMessenger.Default.Send. Мой вопрос, как справиться с этой ситуацией?

В другую сторону, если я удалюasyncи ключевое слово в обработчике, мой код работает правильно. но проблема в том, что я не ждуIAsyncOperationи я хочуawaitв нем.

Я добавляю обсуждение на CommunityToolkit GitHub по этому поводу.

1 ответ

Мой вопрос, как справиться с этой ситуацией?

ПосколькуMessageHandlerне будет (не может) ожидаться набором инструментов, он возвращается при вызовеawait ....

Вы можете попробовать что-то вроде этого:

      WeakReferenceMessenger.Default.Register<ContinueCallbackAnsweringRequestMessage>(
    this, (r, m) => m.Reply(ShowDialogAndWaitForResult()));

...гдеShowDialogAndWaitForResult()обычайasyncметод, который возвращаетTask<T>, называетShowAsync()диалогового окна и дождитесь результата.

Другой вариант — реализовать собственный блокирующий (не асинхронный) диалог. Или рассмотрите другое решение, не связанное с мессенджером.

Другие вопросы по тегам