C# 如何在c中只处理上一个任务并放弃上一个任务#

C# 如何在c中只处理上一个任务并放弃上一个任务#,c#,asynchronous,C#,Asynchronous,我有一个WPF应用程序。窗口包括用于显示数据的datagrid和用于搜索数据的按钮。在viewmodel中,有一种将数据加载到datagrid的方法 public List<MyObject> DataGridData { get; set; } public void LoadDataToDatagrid(object obj) { Task.Run(() => { DataGridData =

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

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

    public void LoadDataToDatagrid(object obj)
    {
        Task.Run(() =>
        {
            DataGridData = new List<MyObject>(repository.GetData());
        });
    }
公共列表DataGridData{get;set;}
公共void LoadDataToDatagrid(对象obj)
{
Task.Run(()=>
{
DataGridData=新列表(repository.GetData());
});
}
每次单击按钮加载数据时,数据都会加载到datagrid,但这需要很长时间。因此,当我多次单击按钮时,将加载第一个数据。我将开始使用它们,然后再次加载新数据

如何停止以前的任务并仅加载上次单击按钮的数据


感谢您的回答

您可以在加载内容之前禁用该按钮吗

您必须将按钮禁用属性设置为对ViewModel中的bool具有依赖关系,然后在添加到datagrid时将其设置为true,然后在添加到datagrid时将其设置为false。 要做到这一点,我假设您可以发起某种类型的活动:

NotifyPropertyChanged();
在XAML中,您可以执行如下操作:

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

其中CanClose是ViewModel中的一个布尔。当你改变bool的状态时,你必须引发某种事件。您也可以先禁用该按钮,然后开始填充数据网格,完成后再次启用它?

已解决:

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);
        }
}
List tokens=newlist();
公共列表DataGridData{get;set;}
公共void LoadDataToDatagrid(对象obj)
{
foreach(令牌中的var令牌)
token.Cancel();
CancellationTokenSource tokenSource=新的CancellationTokenSource();
tokens.Add(tokenSource);
var task=task.Run(()=>
{
返回repository.GetData();
},tokenSource.Token);
尝试
{
DataGridData=等待任务;
}
最后
{
tokenSource.Dispose();
令牌。移除(令牌源);
}
}
该代码只显示上次方法调用的数据,而不冻结应用程序。
谢谢你的回答Dmitry Bychenko。

我想你应该换个角度看。在任务完成之前,不要通过禁用按钮来允许后续的按钮单击。它是应答,因此您不需要最后的注释。你们可能会给出一些示例代码,但当我禁用按钮时,会使我的应用程序冻结。我还有一些过滤器设置,为了简单起见我没有在这里提到。它不应该冻结你的应用程序。如果您使用的是像fx这样的框架。Caliburn Micro或Prism,所有这些都使它更加平滑。