我一直在寻找这个问题的答案,但似乎找不到令人满意的答案。也许这里有人可以启发我。
我有一个BindingList<T>
存储对对象的引用的后代,SynchronizationContext
以便在 UI 线程上引发其更改的事件。
现在,它也有可能BindingList<T>
是在 UI 线程而不是后台线程上创建和使用的。如果没有类似可用的属性,我该如何检查InvokeRequired
?SynchronizationContext.Send
在 UI 线程上调用会有什么后果?
我一直在寻找这个问题的答案,但似乎找不到令人满意的答案。也许这里有人可以启发我。
我有一个BindingList<T>
存储对对象的引用的后代,SynchronizationContext
以便在 UI 线程上引发其更改的事件。
现在,它也有可能BindingList<T>
是在 UI 线程而不是后台线程上创建和使用的。如果没有类似可用的属性,我该如何检查InvokeRequired
?SynchronizationContext.Send
在 UI 线程上调用会有什么后果?
Send 方法将同步执行,并在绑定SynchronizationContext
的线程上调用委托。SynchronizationContext
如果SynchronizationContext
绑定到 UI 线程并且代码当前正在 UI 线程上执行,那么将直接调用委托,而无需在线程之间编组。
send 方法将在 UI 线程上同步执行,这是真的。但是,需要担心的一个可能后果是调用 Send 会增加调用堆栈。
因此,例如,以下代码:
for (int i = 0; i < 10000000; i++) syncContext.Send(....);
将导致 StackOverflow 异常......这就是为什么如果您已经在所需的线程上运行,避免使用同步上下文可能是明智的。除了做一些内部簿记之外,我不知道有任何完整的方法来检查列表是在哪个线程上创建的。