gpt4 book ai didi

C# async dispatcher operation not recognized variable 自启动以来已更改

转载 作者:太空宇宙 更新时间:2023-11-03 19:57:14 25 4
gpt4 key购买 nike

我正在尝试实现一种方法,当用户将鼠标光标置于组件中时,该方法将在 WPF 中触发 UI 事件。

行为应该是:

1)鼠标光标进入组件,调用方法mouseEnter

2) 1 秒计时器开始

3) 如果光标仍在组件中,则触发事件(在本例中,打开一个展开器)。

最初,这是使用 Thread 完成的,但现在使用 Dispatcher 异步执行。

当光标进入组件时,一个名为mouseInbool 被设置为true。当光标离开组件时,mouseIn 设置为 false。

问题是,如果用户将光标放入组件中,然后在 1 秒计时器结束之前将其移出组件,delegate 仍然会看到 mouseIn 为 true,即使我已经确认一旦光标离开它就会将其设置为 false。

void mouseEnter(object sender, MouseEventArgs e) {
mouseIn = true;
Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => {
Thread.Sleep(1000);
if (mouseIn) {
exp.IsExpanded = true;
}
}
}

void mouseLeave(object sender, MouseEventArgs e) {
mouseIn = false;
}

async delegate 通常只保存外部变量启动时的状态吗?如果是这样,是否有办法强制它重新检查值,或者如果失败,是否有更好的方法来实现此行为?

非常感谢。

最佳答案

事实上,您在 UI 线程上安排了您的 Action,然后使用 Thread.Sleep 在其上阻塞(尽管您确实使用 BeginInvoke 将其异步排队) 几乎没有机会调用 mouseLeave 事件处理程序。

您可以使用 Task.Delay 来解决完全不阻塞消息循环的问题。一旦点击 await,它将把控制权交还给 UI 消息循环,并且一旦延迟结束,将在 UI 线程上安排继续:

async void mouseEnter(object sender, MouseEventArgs e)
{
mouseIn = true;
await Task.Delay(1000);

if (mouseIn)
{
exp.IsExpanded = true;
}
}

void mouseLeave(object sender, MouseEventArgs e)
{
mouseIn = false;
}

关于C# async dispatcher operation not recognized variable 自启动以来已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32253675/

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