gpt4 book ai didi

c# - 来自新线程的 Dispatcher.Invoke 正在锁定我的 UI

转载 作者:行者123 更新时间:2023-11-30 13:49:45 24 4
gpt4 key购买 nike

我正在使用 wpf,我的用户界面上有一个按钮。

当用户点击它时,我有一个 for 循环运行一个新方法,在一个使用 autoresetevent 的新线程上。

在那个新线程的那个方法中,我使用了一个标签,我们称它为 lblStatus。我想更新这个线程上不在 ui 上的标签。使用 wpf,我必须使用 Dispatcher.Invoke。

这是我的代码示例:

 Thread thread= new Thread(StartLooking);
thread.Start();
_waitHandle.WaitOne();

private void StartLooking(object value)
{
if (lblStatus.Dispatcher.Thread == Thread.CurrentThread)
{
lblStatus.Content = "Scanning>...";
}
else
{
lblStatus.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() => lblStatus.Content = "Scanning>>>>>"));
}
_waitHandle.Set();
}

程序到此为止。它不会改变标签的内容,它会返回到我的用户界面,但会阻止它。
我试过了

lblStatus.Dispatcher.Invoke(DispatcherPriority.Normal, new LblStatusThreadCheck(lblStatusThreadCheck), "Scanning...");

同样如此,但这也不起作用。有什么想法吗?

最佳答案

问题是您使它无法执行,因为您正在使用 Invoke。

Dispatcher.Invoke 在 UI 线程处理之前不会返回。但是,您已通过调用 _waitHandle.WaitOne(); 阻止了 UI 线程,并且在此过程之后才设置等待句柄。两者有效地造成了死锁。

如果您将其切换为使用 BeginInvoke,UI 将对元素进行排队,设置等待句柄,然后更新标签。但是,它会起作用而不是阻塞。

关于c# - 来自新线程的 Dispatcher.Invoke 正在锁定我的 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8527778/

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