gpt4 book ai didi

wpf - 根据导航取消并启动新的异步任务

转载 作者:行者123 更新时间:2023-12-03 10:58:47 24 4
gpt4 key购买 nike

我有一个 WPF 表单,它的屏幕分为两部分作为主详细信息表单。上面的部分是主人,它显示了一个数据网格中的一堆记录,这些记录是数据绑定(bind)到一个collectionviewsource。
每当用户单击一行时,表单的底部都是通过对 collectionviewsource.current_changed 事件使用react来构建的。
在那里,我取消了所有挂起的异步操作,并开始一个新的操作。
代码是这样的:

if (_tokenSource != null) //_tokenSource is an instance variable of the class that implements current_changed
{
try
{
_tokenSource.Cancel(); //needed because _tokenSource might be disposed already. Ugly.
}
catch (Exception Ex)
{
}
}

using (_tokenSource = new CancellationTokenSource())
{
try
{
_unitOfWork = await loadRelatieAsync(relatieId, _tokenSource.Token); // this is just currently an await Task.Delay(5000,token).ConfigureAwait(true); return null;
}
catch (Exception Ex)
{
}
}
//_tokenSource = null; can’t do this, it would lead to several operations not being cancelled

我在这里的东西似乎可以工作,但是代码很丑,应用程序仍然有点迟钝。有没有合适/更好的方法来做到这一点?

最佳答案

我通常不会费心处理 CancellationTokenSource .如果你只是覆盖它而不释放它,代码会更干净:

if (_tokenSource != null)
_tokenSource.Cancel();

_tokenSource = new CancellationTokenSource();
try
{
_unitOfWork = await loadRelatieAsync(relatieId, _tokenSource.Token);
return null;
}
catch (OperationCanceledException ex)
{
}

关于“呆滞”,我猜测可能是由于用户快速更改了主视图中的选定项目?如果是这样,您可能希望在开始新操作之前引入一个小的(例如 100 毫秒)延迟。这可以通过 async 来完成代码如下:
if (_tokenSource != null)
{
_tokenSource.Cancel();
_tokenSource = null;
}

var currentItem = _whateverView.CurrentItem;
await Task.Delay(TimeSpan.FromMilliseconds(100));
if (currentItem != _whateverView.CurrentItem)
return null;

_tokenSource = new CancellationTokenSource();
try
{
_unitOfWork = await loadRelatieAsync(relatieId, _tokenSource.Token);
return null;
}
catch (OperationCanceledException ex)
{
}

尽管我必须说,如果您正在执行大量“基于时间”的操作(例如“将此操作延迟一段时间”或“根据此时间窗口限制这些事件”),那么更自然的方法会是 Reactive Extensions .

关于wpf - 根据导航取消并启动新的异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28394425/

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