我正在做应用程序,我的用户界面有问题。用户调用异步方法,该方法接收描述文本。如果用户调用该方法10次,则显示描述文本的标签将闪烁10次。对我来说,从10次引起的方法只有最后显示结果,如何取消之前的任务(线程)?
private async void DisplayShortDescription(object parameter)
{
var id = (int) parameter; // as string;
var description = await FindDescription(id);
ShortDescription = description.ShortDescription;
CurrentDescriptionId = id;
}
只有上一个任务才能执行以下行:
ShortDescription = description.ShortDescription;
CurrentDescriptionId = id;
答案 0 :(得分:0)
您需要做的是存储任务
所以你有var description = await FindDescription(id);
你可以做到
task = FindDescription(id);
var description = await task;
任务是
private Task<FindDescriptionReturnType> task;
然后你可以做类似
的事情public void Button_Click(){
if(task?.IsCompleted??true)
{
DisplayShortDescription()
}
}
但是,如果您确实需要取消操作,则使用.net方式 CancellationToken
CancellationTokenSource source = new CancellationTokenSource();
var task = CancellantionMethod(source.Token);
source.Cancel();
await task;
public async Task CancellantionMethod(CancellationToken token) {
while(!token.IsCancellationRequested)
{
//do something
}
}
支持取消的大多数异步方法都会接受取消令牌作为参数
如果您无法安全取消,就像在上面的循环中一样,CancellationToken还提供了一个方法ThrowIfCancellationRequested();
,它会以异常终止您的代码
答案 1 :(得分:-1)
编辑:如果你真的想检查它是否是最后一个帖子
如果要检查,请存储任务对象:
private Task<?> _lastTask;
private async void DisplayShortDescription(object parameter)
{
var id = (int) parameter; // as string;
var currentTask = FindDescription(id)
_lastTask = currentTask;
var description = await currentTask;
if (currentTask == _lastTask)
{
ShortDescription = description.ShortDescription;
CurrentDescriptionId = id;
}
}
您真正想要做的是检查属性是否已更改:
private async void DisplayShortDescription(object parameter)
{
var id = (int) parameter; // as string;
var description = await FindDescription(id);
if (ShortDescription != description.ShortDescription)
{
ShortDescription = description.ShortDescription;
}
if (CurrentDescriptionId != id)
{
CurrentDescriptionId = id;
}
}
更好的是,你可以在你的财产中处理这个问题:
private string _shortDescription;
public property string ShortDescription
{
get { return _shortDescription; }
set
{
if (_shortDescription == value)
{
return;
}
_shortDescription = value;
// do other stuff
}
}