22

I just wrote this code:

System.Threading.SynchronizationContext.Current.Post(
    state => DoUpdateInUIThread((Abc)state), 
    abc);

but System.Threading.SynchronizationContext.Current is null

madth3
  • 7,275
  • 12
  • 50
  • 74
Ian Ringrose
  • 51,220
  • 55
  • 213
  • 317

2 Answers2

20

To get it to work.

In your class

private SynchronizationContext synchronizationContext;

In the UI thread (main thread)

synchronizationContext = System.Threading.SynchronizationContext.Current;

In the worker thread

synchronizationContext.Post(    
   state => DoUpdateInUIThread((Abc)state),     
   abc);
Ian Ringrose
  • 51,220
  • 55
  • 213
  • 317
  • How is the syncronizationContext instantiated in, or passed to, the worker thread? – Tim Jun 02 '13 at 01:46
  • Let's say you're using a `BackgroundWorker` in your form. If you save off `SynchronizationContext.Current` in your constructor or load event as a class level variable, it'll be accessible in the `RunWorkerCompleted` handler. Alternatively, if you're doing the work in another class, like a presenter, you could create the presenter on the UI thread and save off the context in the constructor. – Jeff B Jun 20 '13 at 19:20
17

See this explanation.

SynchronizationContext.Current is only set in the main thread (which is the only thread where you don't actually need it)

The blog post proposes a workaround.

Stelios Adamantidis
  • 1,866
  • 21
  • 36
Marcel Gosselin
  • 4,610
  • 2
  • 31
  • 54