6

我一直在寻找这个问题的答案,但似乎找不到令人满意的答案。也许这里有人可以启发我。

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

现在,它也有可能BindingList<T>是在 UI 线程而不是后台线程上创建和使用的。如果没有类似可用的属性,我该如何检查InvokeRequiredSynchronizationContext.Send在 UI 线程上调用会有什么后果?

4

2 回答 2

3

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

于 2011-03-28T23:47:55.953 回答
-2

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

因此,例如,以下代码:

for (int i = 0; i < 10000000; i++) syncContext.Send(....);

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

于 2014-01-08T15:53:10.360 回答