中止先前的异步调用并处置已使用的资源

尼莱什

我有一个负责渲染网格记录的类。

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的最佳方法是什么?

sQuir3l

您可以将取消令牌用于异步方法。当调用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章