完成最后一个Tread C#

时间:2018-02-01 10:11:02

标签: c# xamarin task

我正在做应用程序,我的用户界面有问题。用户调用异步方法,该方法接收描述文本。如果用户调用该方法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;

2 个答案:

答案 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
    }
}