gpt4 book ai didi

.net - 尝试从后台线程更新 UI : Why does it sometimes throw and sometimes just do nothing?

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

我注意到在 WPF 中,当尝试从后台线程更新 UI 时(我知道你不应该这样做 - 只是玩弄东西),有时它会抛出 InvalidOperationException,有时它只是什么也没做。我第一次注意到这一点是在我不正确地尝试从异步 WCF 调用启动的后台线程(使用 Begin/End,而不是自动编码到 UI 线程的事件模型)更新 UI 时。

例如,假设我有一个带有按钮和复选框的简单表单。此代码每次都会抛出 InvalidOperationException(“调用线程无法访问此对象,因为不同的线程拥有它。”):

private void button1_Click(object sender, RoutedEventArgs e)
{
new Thread(() => checkBox1.IsChecked = true).Start();
}

现在,采用相同的形式,并将 bog 标准服务引用添加到某个简单的 WCF 服务。然后试试这个:

private void button1_Click(object sender, RoutedEventArgs e)
{
var client = new MyServiceClient();
//Note the use of Begin/End as opposed to the eventing model - Callback
//will not be called on the UI thread, but a worker thread. I have
//verified this through the debugger thread list and by checking the
//result of Dispatcher.CheckAccess() in the callback.
client.BeginMyServiceMethod("MyArgument", Callback, null);
}

private void Callback(IAsyncResult result)
{
//If I call Dispatcher.CheckAccess() here, it returns false,
//but if I call Dispatcher.VerifyAccess() it does not throw!
checkBox1.IsChecked = true; // no exception, no effect
}

我的理解是,在该回调方法中调用 Dispatcher.VerifyAccess() 应该抛出异常,就像尝试操作 checkBox1 上的任何内容一样。相反,什么也没有发生 - UI 中的复选框不会被选中,也不会引发任何异常。有谁知道为什么会这样吗?

最佳答案

调用回调方法的框架代码是否可能吞没异常?在回调中放入 try/catch 以查看是否抛出异常。如果是这样,那么您就知道框架正在吞噬异常。

关于.net - 尝试从后台线程更新 UI : Why does it sometimes throw and sometimes just do nothing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5981817/

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