我有一个WPF应用程序。窗口包括用于显示数据的datagrid和用于搜索数据的按钮。在viewmodel中,有一种将数据加载到datagrid的方法。
public List<MyObject> DataGridData { get; set; }
public void LoadDataToDatagrid(object obj)
{
Task.Run(() =>
{
DataGridData = new List<MyObject>(repository.GetData());
});
}
每次,当我单击按钮以加载数据时,数据都将加载到datagrid,但是需要很长时间。因此,当我多次单击按钮时,将加载第一个数据。我将开始使用它们,然后再次加载新数据。
如何停止上一个任务并仅加载最后一次单击按钮的数据?
感谢您的回答
答案 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);
}
}
该代码仅显示来自没有冻结应用程序的最后一个方法调用的数据。 感谢您回答德米特里·拜琴科。