Асинхронный обработчик 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()
диалогового окна и дождитесь результата.
Другой вариант — реализовать собственный блокирующий (не асинхронный) диалог. Или рассмотрите другое решение, не связанное с мессенджером.