Pregunta

I have been looking all over for an answer to this question, but can't seem to find a satisfactory answer. Maybe someone here can enlighten me.

I have a descendent of BindingList<T> that stores a reference to a SynchronizationContext object in order to raise its changed events on the UI thread.

Now, it's also possible that this BindingList<T> was created and used on the UI thread and not a background thread. How do I check this without a property like InvokeRequired available to me? What are the consequences of calling SynchronizationContext.Send on the UI thread?

¿Fue útil?

Solución

The Send method on SynchronizationContext will execute synchronously and call the delegane on the thread to which the SynchronizationContext is bound. If the SynchronizationContext is bound to the UI thread and the code is currently executing on the UI thread then the delegate will just be invoked directly with no need to marshal between threads.

Otros consejos

The send method will execute synchronously and on the UI thread, that's true. However, one possible consequence to worry about, is that calling Send will increase the call stack.

So, for example, the following code:

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

will cause a StackOverflow exception... That's why it might be wise to avoid using the synchronization context if you're already running on the desired thread. I don't know of any full-proof way to check which thread was the list was created on, beside doing some internal bookkeeping.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top