作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我注意到在 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/
我是一名优秀的程序员,十分优秀!