- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经看到(并阅读)关于使用 Dispatcher.BeginInvoke 来确保 UI 更新发生在 UI 线程上。我明白这个道理。
但是我看到了在 View 代码隐藏中分配属性(例如 TextBlock 的 Text 属性)的示例,仅当您在此 Dispatcher.BeginInvoke 中分配它时才被声明为安全的。
问题
如果我从 View 的代码隐藏中操作任何内容,是否暗示它正在 UI 线程上进行操作(假设我没有使用 BackgroundWorker 或异步服务调用)。
在我上面提到的示例中,没有使用其他线程或异步操作。
问题2
如果我有一个异步 Web 服务处理程序,并且我想从该处理程序中更新 TextBlock 的字符串。我可以直接分配 TB 的 Text 属性,还是应该使用 Dispatcher.BeginInvoke。请注意,我通常不会这样做,因为我更喜欢数据绑定(bind)而不是像这样的直接 UI 元素操作。
最佳答案
您问“是否暗示它正在 UI 线程上被操纵”。没有任何东西可以提供绝对的保证,因为 Mike 指出非私有(private)代码入口点可能会在非 UI 线程上调用。
但是,您可以确定来自 UI 元素的事件将在 UI 线程上。
至于采取任何预防措施以确保您的代码隐藏在 UI 线程上运行,我认为这是不明智的。如果你让代码正常运行会发生什么。可能它成功了,因为您实际上并没有与 UI 元素交互,没有造成任何伤害。或者代码继续并引发异常。那不好吗?
使用预防措施BeginInvoke
导致调用代码与被调用的 UI 操作代码异步完成。这可能会产生无法预测的结果,这可能是追踪的噩梦。让您的代码行为可预测要好得多。只需将错误返回到应该负责在正确线程上调用 UI 组件的代码。毕竟代码隐藏作为 UI 组件的一部分运行,例如 UserControl
或 Page
.
还要考虑运行时、SDK 和工具包中的现有 UI 元素不进行预防性线程切换。
编辑:回答厚颜无耻的第二个问题
这取决于您使用的异步 API 以及调用该 API 的线程。
当您调用 WebClient
来自 UI 线程的异步方法,然后相应的事件也会在 UI 线程上引发。同样,如果您使用的是 WCF 服务客户端类,并且最初在 UI 线程上调用异步操作,则会在 UI 线程上引发 Completed 事件。
但是,当在 WebRequest 组件(或 WCF 的标准服务接口(interface))上使用 Begin/End 对时,回调将在后台线程上运行,而与用于启动操作的原始线程无关。
关于silverlight - 为什么使用 Dispatcher.BeginInvoke?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7032135/
我对 Dispatcher.CurrentDispatcher.BeginInvoke 和 BeginInvoke 之间的区别感到困惑 我有以下部分代码不起作用,UpdateCounts 方法中的代码
我最初尝试使用 Dispatcher 类 BeginInvoke 方法在我的 C# Windows 窗体应用程序的主 UI 线程上显示消息框。当我使用该方法时,消息框没有出现。我在传递给 BeginI
伙计们! 我的.net应用程序有问题。当我尝试在程序中打印时,它会崩溃崩溃 与任何错误消息。我从Windows中的事件查看器中获得的有关错误的信息。有人能帮我吗?但是在另一台计算机上它可以正常工作。我
我有简单的(我认为的)逻辑。 public static void NotifyAboutNewJob(int jobId, bool forceSending = false) {
我有一个 c# .NET winforms 应用程序进行此异步调用: simpleDelegate.BeginInvoke(null, null); 委托(delegate)正在调用我的函数,一切正常
1) 我听说当我们不调用 EndInvoke() 时可能会导致内存泄漏?你能演示一下这怎么会导致内存泄漏吗? 2) 当我想调用 EndInvoke() 时,我应该使用如下代码吗? namespace
我遇到了在多线程应用程序中使用 Dispatcher.BeginInvoke 导致的我无法理解的错误。 我的程序包含一个 List 对象,我使用多个线程循环遍历这些对象并执行一些计算。我已将我的代码结
我正在研究其他人的代码,但对多线程没有太多经验。我遇到了这行代码: BeginInvoke((MethodInvoker)delegate() { btnCalibrate.PerformClick(
我继承了从主线程调用 BeginInvoke 的代码(不是后台线程,通常是这种模式)。我试图了解它在这种情况下的实际作用。 在 BeginInvoke 中调用的方法是否符合下行到窗口的消息?文档说 a
为什么会出现此错误以及如何修复它。感谢帮助 错误 4 无法将 lambda 表达式转换为类型“System.Delegate”,因为它不是委托(delegate)类型 void provide
我在 WPF 应用程序中有一些代码如下所示: public class MyTextBox : System.Windows.Controls.TextBox, IDisposable { p
我有以下问题。 FindRoot 实际上在第三方 dll 中,我无法控制它。 它必须通过 Begin invoke 调用。有时,FindRoot 方法会抛出异常。这导致我的整个应用程序崩溃。现在,即使
这个问题在这里已经有了答案: Does Func.BeginInvoke use the ThreadPool? (2 个答案) 关闭 1 年前。 在我的 WPF 应用程序中,我想在非 UI 线程中
我是线程和异步编程的新手。我正在尝试学习这些概念,到目前为止,我已经理解了,但是还有一个问题要问。 可以说我想调用一个名为GetAllUsers()的方法,该方法需要很长时间才能执行,因此它不会阻塞资
我已经看到(并阅读)关于使用 Dispatcher.BeginInvoke 来确保 UI 更新发生在 UI 线程上。我明白这个道理。 但是我看到了在 View 代码隐藏中分配属性(例如 TextBlo
我想确定使用 BeginInvoke 时执行处理程序的线程。现在,每次我调用该方法时,处理程序都会由不同的线程执行。有没有办法确定线程? using System; using System.Thre
我有一个长时间运行的函数¹: public string FindPasswordFromHash(String hash) { ... } 它被称为: private void Button
我找不到这个简单问题的答案:BeginInvoke() 是否保证以原子方式执行被调用的委托(delegate)?例如,如果我有类似的东西 public ObservableCollection Ite
我收到一个 InvalidOperationException 消息 Cross-thread operation not valid.. _waitForm 是在主窗体的构造函数中创建的。屏幕截图中
我是编码新手,在我的第一个项目中,我必须从数显卡尺读取信息并将其显示在网络应用程序的文本框中。我从另一个项目中找到了代码,其他人在他们使用 Windows 窗体的地方创建了这些代码。我正在使用 vis
我是一名优秀的程序员,十分优秀!