【发布时间】:2018-12-12 15:38:28
【问题描述】:
我已经开始学习一些使用 Xamarin Forms 和 MvvmCross 的移动开发。
在最简单的形式中,我有一个包含按钮的应用程序。当点击此按钮时,它会通过休息服务调用 api,并通过消息服务返回数据。
我在使用 ICommand.Execute(object) 模式时遇到了显示对话框 (ACR) 的问题。我假设这是因为此模式中的执行不是异步的,因此会阻塞主 ui 线程?这是我正在做的一个示例:
var cmd = Command.Create(CmdType.Login);
cmd.Execute(User);
对于异步操作,请直接考虑 MvvmCross 文档中的以下几行。
MyCommand = new MvxCommand(() => MyTaskNotifier = MvxNotifyTask.Create(() => MyMethodAsync(), onException: ex => OnException(ex)));
private async Task MyMethodAsync()
{
await _someService.DoSomethingAsync();
// ...
}
在这种情况下,我的 DoSomething() 不是 aysnc - 如果有的话,它是 async void 或 no no。为了解决这个问题,我将 MvxCommand 更新为 MvxAsyncCommand,然后必须使用创可贴来显示对话框。
await Task.Delay(300);
或
await Task.Run(() => { command.Execute(User); }).ConfigureAwait(false);
此时,我显然在质疑命令模式的使用。我是否错过了一个简单的解决方案,或者我选择了一个不适合这里的架构?任何指导表示赞赏。
【问题讨论】:
-
对于其他人来说,我计划实施类似于以下文章中建议的解决方案。 msdn.microsoft.com/en-us/magazine/dn630647.aspx