首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SynchronizationContext和InvokeRequired

SynchronizationContext和InvokeRequired
EN

Stack Overflow用户
提问于 2011-03-29 06:20:47
回答 2查看 1.8K关注 0票数 6

我一直在到处寻找这个问题的答案,但似乎找不到令人满意的答案。也许这里有人能开导我。

我有一个BindingList<T>的后代,它存储了对SynchronizationContext对象的引用,以便在UI线程上引发其已更改的事件。

现在,也有可能这个BindingList<T>是在UI线程而不是后台线程上创建和使用的。如果没有像InvokeRequired这样的属性,我该如何检查呢?在UI线程上调用SynchronizationContext.Send的结果是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-29 07:47:56

SynchronizationContext上的Send方法将同步执行,并调用SynchronizationContext绑定到的线程上的委托。如果SynchronizationContext绑定到UI线程,并且代码当前正在UI线程上执行,那么委托将直接被调用,而不需要在线程之间进行编组。

票数 3
EN

Stack Overflow用户

发布于 2014-01-08 23:53:10

send方法将在UI线程上同步执行,这是真的。然而,需要担心的一个可能的后果是,调用Send会增加调用堆栈。

因此,例如,下面的代码:

代码语言:javascript
运行
复制
for (int i = 0; i < 10000000; i++) syncContext.Send(....);

将导致StackOverflow异常...这就是为什么如果您已经在所需的线程上运行,避免使用同步上下文可能是明智的。除了做一些内部记账之外,我不知道有什么完全可靠的方法来检查列表是在哪个线程上创建的。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5465736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档