Xamarin.android 如何取消IMvxAsyncCommand?

Xamarin.android 如何取消IMvxAsyncCommand?,xamarin.android,mvvmcross,Xamarin.android,Mvvmcross,我刚开始在MVVMcross平台上使用xamarin android。我需要取消一个imvxancync命令,但我尝试了很多方法,它仍然不起作用。有人对此有任何想法或示例吗?因此基本上,imvxancommand只调用任务,如下所示: MyCommand=new MvxAsyncCommand(MyTask); ... 专用异步任务MyTask() { //做异步的事情 } 要取消任务,您需要使用CancellationToken,您可以从CancellationTokenSource获取该任

我刚开始在MVVMcross平台上使用xamarin android。我需要取消一个imvxancync命令,但我尝试了很多方法,它仍然不起作用。有人对此有任何想法或示例吗?

因此基本上,
imvxancommand
只调用
任务
,如下所示:

MyCommand=new MvxAsyncCommand(MyTask);
...
专用异步任务MyTask()
{
//做异步的事情
}
要取消
任务
,您需要使用
CancellationToken
,您可以从
CancellationTokenSource
获取该任务,并使用另一个命令或任何您想在
CancellationTokenSource
上调用的
cancel()
,因此您可以使用以下方法:

公共类MyClass
{
私有取消令牌源cts;
公共MyClass()
{
MyAsyncCommand=新的MvxAsyncCommand(MyTask);
CancelMyTaskCommand=newMVxCommand(()=>cts.Cancel());
}
public ICommand myasync命令{get;private set;}
public ICommand CancelMyTaskCommand{get;private set;}
专用异步任务MyTask()
{
cts=新的CancellationTokenSource();
等待MyAsyncStuff(cts.CancellationToken);
cts.Dispose();
cts=null;
}
专用异步任务MyAsyncStuff(CancellationToken CancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
等待foo.blaasync();
cancellationToken.ThrowIfCancellationRequested();
等待吧。WhateverAsync();
cancellationToken.ThrowIfCancellationRequested();
等待foo2.AnotherAsync();
}
}
然后,您可以改进代码以避免重复调用
任务
、处理取消异常、使用和其他许多操作,但这是基础

更多信息请访问
HIH

您实际上可以直接取消
MvxAsyncCommand
,而无需创建任何额外的
CancellationTokenSource

只需对对象本身调用
Cancel()

因此,不要使用
ICommand
IMvxCommand
属性,而是使用
MvxAsyncCommand
imvxasyncommand

这样,当您的
任务中有
CancellationToken
作为参数,并且您在命令上调用
Cancel()
时,它将取消该令牌

专用异步任务MyAsyncStuff(CancellationToken ct)
{
等待abc法(ct);
//和/或
ct.ThrowIfCancellationRequested();
}
因此,如果您修改@fmacaroni的答案,您将得到以下结果:

公共类MyClass
{    
公共MyClass()
{
MyAsyncCommand=新的MvxAsyncCommand(MyAsyncStuff);
CancelMyTaskCommand=new MvxCommand(()=>MyAsyncCommand.Cancel());
}
公共IMvxAsyncCommand MyAsyncCommand{get;private set;}
public ICommand CancelMyTaskCommand{get;private set;}
专用异步任务MyAsyncStuff(CancellationToken CancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
等待foo.blaasync();
cancellationToken.ThrowIfCancellationRequested();
等待吧。WhateverAsync();
cancellationToken.ThrowIfCancellationRequested();
等待foo2.AnotherAsync();
}
}
编辑:如果异步方法还允许传递
CancellationToken
直接取消它们,那么
MyAsyncStuff
方法可以编写为:

专用异步任务MyAsyncStuff(CancellationToken CancellationToken)
{
等待foo.BlablaAsync(cancellationToken);
等待条。WhateverAsync(取消令牌);
等待foo2.AnotherAsync(cancellationToken);
}
或者,如果您不在乎他们开始和完成的顺序:

私有任务MyAsyncStuff(CancellationToken CancellationToken)
{
返回任务.WhenAll(
foo.blaasync(cancellationToken),
bar.WhateverAsync(取消令牌),
foo2.AnotherAsync(cancellationToken));
}

嘿,休伊!欢迎来到SO!我昨天的做法是在函数调用的开头添加一个返回。但真正能帮助我们的是,如果您在问题中分享一些代码。以下是一篇可以帮助您阅读的好文章: