如何仅处理最后一个任务并丢弃c#

时间:2019-09-03 06:49:46

标签: c# asynchronous

我有一个WPF应用程序。窗口包括用于显示数据的datagrid和用于搜索数据的按钮。在viewmodel中,有一种将数据加载到datagrid的方法。

    public List<MyObject> DataGridData { get; set; }

    public void LoadDataToDatagrid(object obj)
    {
        Task.Run(() =>
        {
            DataGridData = new List<MyObject>(repository.GetData());
        });
    }

每次,当我单击按钮以加载数据时,数据都将加载到datagrid,但是需要很长时间。因此,当我多次单击按钮时,将加载第一个数据。我将开始使用它们,然后再次加载新数据。

如何停止上一个任务并仅加载最后一次单击按钮的数据?

感谢您的回答

2 个答案:

答案 0 :(得分:3)

您也许可以禁用按钮,直到内容加载完毕?

您必须将按钮禁用属性设置为对ViewModel中的bool有依赖关系,然后在将其添加到数据网格时将其设置为true,然后在完成后将其设置为false。 为此,我假设您可以引发以下事件:

NotifyPropertyChanged();

在XAML中,您将执行以下操作:

<Button IsEnabled="{Binding CanClose}"/>

在您的ViewModel中,CanClose是一个布尔值。更改布尔状态时,必须引发某种事件。您还可以先禁用该按钮,然后开始填充数据网格,完成后再重新启用它?

答案 1 :(得分:0)

已解决:

List<CancellationTokenSource> tokens = new List<CancellationTokenSource>();

public List<MyObject> DataGridData { get; set; }

public void LoadDataToDatagrid(object obj)
{
        foreach (var token in tokens)
            token.Cancel();

        CancellationTokenSource tokenSource = new CancellationTokenSource();
        tokens.Add(tokenSource);

        var task = Task.Run(() =>
        {
            return repository.GetData();
        }, tokenSource.Token);

        try
        {
            DataGridData = await task;
        }
        finally
        {
            tokenSource.Dispose();
            tokens.Remove(tokenSource);
        }
}

该代码仅显示来自没有冻结应用程序的最后一个方法调用的数据。 感谢您回答德米特里·拜琴科。