gpt4 book ai didi

c# - 异步/等待如何处理 "old"结果?

转载 作者:太空宇宙 更新时间:2023-11-03 10:31:55 26 4
gpt4 key购买 nike

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

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

OnItemsLoaded(items);
}

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

例子:调用 1 => 调用 2 => 调用 2 的结果 => 调用 1 的结果

这就是为什么我使用 TaskContinueWith 检查线程 ID 并丢弃“旧”结果的原因。但我想将其更改为 Async/Await 模式。

有两种情况:

  1. Reload 为真:应丢弃所有旧线程/结果。仅应处理“最新”结果。
  2. Reload 为 false:应处理所有线程/结果。

最佳答案

你想要的可以使用协作取消机制来实现,由 CancellationTokenCancellationTokenSource 实现。

您需要做的是将一个 token 传递给您的方法,并在执行您的工作时监控该 token 。如果用户请求取消,您就取消操作。

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 方法中,您需要监控该 token :

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。后者仅适用于顶级事件处理程序。

关于c# - 异步/等待如何处理 "old"结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29768839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com