Reputation: 921
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?
Upvotes: 6
Views: 2009
Reputation: 755347
The Send method on SynchronizationContext
will execute synchronously and call the delegate 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.
Upvotes: 3
Reputation: 5032
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.
Upvotes: -2