我有一个负责渲染网格记录的类。
ObservableCollection<Dictionary<string, string>> gridData;
ObservableCollection<Dictionary<string, string>> GridData;
{
get
{
return gridData;
}
set
{
this.gridData = value;
NotifyPropertyChanged();
}
}
上面的属性绑定到GridControl(Devexpress WPF)。
下面是一个异步方法,该方法负责从后端服务渲染数据。
public async void RefresRecords()
{
await GetRecords();
}
private async Task GetRecords()
{
int offset = 0;
int limit = 50;
do
{
var dummyData = await GetRangeRecord(offset, limit);
GridData.Add(dummyData);
offset += limit;
} while (GridData.Count() < 1000);
}
private Task<Dictionary<string, string>> GetRangeRecord(int offset, int limit)
{
// This method does processing and returns records from offset to limit
return new Task<Dictionary<string, string>>();
}
从后端服务可以有大量的数据,但我只想显示前1000条记录。
每次调用将以50条记录的块的形式获取记录。绑定属性后,UI将同时刷新。
现在考虑以下用例:
步骤1:调用asyn方法“ RefresRecords”。假设有1000条记录是从后端服务获取的。因此,此方法将循环20次,并且每个服务调用将显示50条记录。
第2步:-在第1步正在进行中时,它是一个异步调用,而另一个调用是针对相同的异步方法“ RefreshRecords”的。
结果:-在第2步之后,由于在随后的两个asyn方法调用中修改了相同的属性,因此将从第2步获取的数据以及第1步的某些部分中加载数据。
问题:-当对同一方法有新的调用时,完全停止Step1的最佳方法是什么?
您可以将取消令牌用于异步方法。当调用GetRecords()方法时,请执行GridData.Clear()。
这是一个非常简单的演示,但希望对您有所帮助。
public static List<int> List = new List<int>();
public static async Task AddToList(CancellationToken cancellation)
{
List.Clear();
for (var i = 0; i < 100 && !cancellation.IsCancellationRequested; i++)
{
await Task.Delay(100, cancellation);
List.Add(i);
}
}
public static async Task MainAsync(CancellationToken cancellation)
{
await AddToList(cancellation);
}
private static void Main(string[] args)
{
var cts = new CancellationTokenSource();
Task.Run(() => MainAsync(cts.Token), cts.Token);
Thread.Sleep(1000);
cts.Cancel();
cts = new CancellationTokenSource();
Task.Run(() => MainAsync(cts.Token), cts.Token).Wait(cts.Token);
Console.WriteLine(List.Count);
Console.Read();
}
希望这有助于
在此处查找更多http://msdn.microsoft.com/zh-cn/library/dd997396(v=vs.110).aspx
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句