异步/等待如何处理“旧”结果?

时间:2015-04-21 09:56:36

标签: c# multithreading wcf asynchronous async-await

我有一个异步加载函数来调用WCF服务,然后对结果做一些事情。

protected async void Load(bool reload)
{
     var items = await GetItems(skip, take, SearchString);

     OnItemsLoaded(items);
}

即使旧的装载没有完成,也可以多次调用Load。

实施例: 呼叫1 =>呼叫2 =>来自呼叫2的结果=>来自呼叫1的结果

这就是我使用TaskContinueWith检查线程ID并丢弃" old"结果。 但我想将其更改为Async / Await模式。

有两种情况:

  1. Reload为真:所有旧线程/结果都应该被丢弃。只有"最新的"结果应该被处理。
  2. Reload为false:应处理所有线程/结果。

1 个答案:

答案 0 :(得分:2)

使用CancellationTokenCancellationTokenSource实施的合作取消机制可以实现您的目标。

您需要做的是在执行工作时将令牌传递给您的方法,然后将监视该令牌。如果用户请求取消,则取消操作。

private CancellationTokenSource cts = new CancellationTokenSource();
protected async Task LoadAsync(bool reload)
{
     if (reload)
     {
        cts.Cancel();
     }

     var items = await GetItems(cts.Token, skip, take, SearchString);
     OnItemsLoaded(items);
}

GetItems方法中,您需要监控该令牌:

public async Task GetItemsAsync(CancellationToken cancellationToken)
{
   while (!cancellationToken.IsCancellationRequested)
   {
      // Do some work.
   }

   // This will cause the task to transfer to a cancelled state, if needed.
   cancellationToken.ThrowIfCancellationRequested();     
}

注意我更改了LoadAsync以返回async Task而不是async void。后者仅适用于顶级事件处理程序。