sor*_*abz 15 prism mvvm async-await xamarin xamarin.forms
我想将异步方法链接到Xamarin.Forms中的prism框架中的委托命令,我的问题是如何做到这一点?
以下解决方案是否正确 是否存在任何陷阱?(僵局,UI缓慢或冻结,不良做法,...)
{ // My view model constructor
...
MyCommand = new DelegateCommand(async () => await MyJobAsync());
...
}
private async Task MyJobAsync()
{
... // Some await calls
... // Some UI element changed such as binded Observable collections
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*ary 11
你可以async void直接使用.但是,从我的经验中得到的一些注释......
代码的结构是:启动异步操作,然后使用结果更新UI.这对我来说意味着你会更好地使用NotifyTask<T>一种异步数据绑定方法,而不是命令.有关后面的设计的更多信息,请参阅我的异步MVVM数据绑定文章NotifyTask<T>(但请注意,最新代码具有错误修正和其他增强功能).
如果你真的这样做需要一个异步的命令(这是更为罕见的),你可以使用async void直接或正如我在上的文章描述了建立一个异步命令型异步MVVM commmands.我也有类型支持这个,但这些API更多的是不断变化.
如果您确实选择async void直接使用:
async Task逻辑公开,或至少可以访问您的单元测试.DelegateTask,必须妥善处理代理人的任何例外情况.如果您使用 Prism 库,请查看此链接:https://prismlibrary.com/docs/commands/commanding.html#implementing-a-task-based-delegatecommand
如果您想传递CommandParameterto DelegateCommand,请在DelegateCommand变量声明中使用此语法
public DelegateCommand<object> MyCommand { get; set; }
Run Code Online (Sandbox Code Playgroud)
在 ViewModel 的构造函数中以这种方式初始化它:
MyCommand = new DelegateCommand<object>(HandleTap);
Run Code Online (Sandbox Code Playgroud)
其中 HandleTap被声明为
private async void HandleTap(object param)
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你。
正如已经提到的,使用委托命令处理异步代码的方法是使用async void. 对此已经有很多讨论,远不止 Prism 或 Xamarin Forms。底线是ICommandXamarin FormsCommand和 PrismDelegateCommand都受ICommand's 的限制void Execute(object obj)。如果您想获得更多相关信息,我鼓励您阅读 Brian Lagunas 的博客,其中解释了DelegateCommand.FromAsync处理程序过时的原因。
通常,通过更新代码可以很容易地处理大多数问题。例如。我经常听到抱怨Exceptions为什么 FromAsync 是必要的“原因”,只是在他们的代码中看到他们从未尝试过。因为async void是一劳永逸,我听到的另一个抱怨是一个命令可以执行两次。这也很容易用DelegateCommands ObservesProperty和修复ObservesCanExecute。
eak*_*gul -1
public ICommand MyCommand{get;set;}
//constructor
public ctor()
{
MyCommand = new Xamarin.Forms.Command(CmdDoTheJob);
}
public async void DoTheJob()
{
await TheMethod();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11322 次 |
| 最近记录: |