我有一个异步加载函数来调用WCF
服务,然后对结果做一些事情。
protected async void Load(bool reload)
{
var items = await GetItems(skip, take, SearchString);
OnItemsLoaded(items);
}
即使旧的装载没有完成,也可以多次调用Load。
实施例: 呼叫1 =>呼叫2 =>来自呼叫2的结果=>来自呼叫1的结果
这就是我使用Task
和ContinueWith
检查线程ID并丢弃" old"结果。
但我想将其更改为Async / Await模式。
有两种情况:
Reload
为真:所有旧线程/结果都应该被丢弃。只有"最新的"结果应该被处理。Reload
为false:应处理所有线程/结果。答案 0 :(得分:2)
使用CancellationToken
和CancellationTokenSource
实施的合作取消机制可以实现您的目标。
您需要做的是在执行工作时将令牌传递给您的方法,然后将监视该令牌。如果用户请求取消,则取消操作。
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
。后者仅适用于顶级事件处理程序。