Вы хотите получить SynchronizationContext
из потока пользовательского интерфейса и затем сделать его доступным для фоновых потоков.
В зависимости от того, какую технологию вы используете, производное SynchronizationContext
будут доступны, но на самом деле это не касается;свойство Current
вернет то, что установлено в данный момент, и Windows Forms и WPF установят для вас нужное.
С SynchronizationContext
, переданным нужному потокучтобы совершать вызовы, вы можете затем вызвать метод Send
(аналог Invoke
метод ) или метод Post
(аналогBeginInvoke
метод ) в зависимости от ваших потребностей.
Вот пример:
public void Button1_OnClick(sender object, EventArgs e)
{
// Get the current SynchronizationContext.
// NOTE: Must make the call on the UI thread, NOT
// the background thread to get the proper
// context.
SynchronizationContext context = SynchronizationContext.Current;
// Start some work on a new Task (4.0)
Task.Factory.StartNew(() => {
// Do some lengthy operation.
...
// Notify the user. Do not need to wait.
context.Post(o => MessageBox.Show("Progress"));
// Do some more stuff.
...
// Wait on result.
// Notify the user.
context.Send(o => MessageBox.Show("Progress, waiting on OK"));
});
}
Также следует отметить, что BackgroundWorker
класс делает все это для вас за кулисами;если эта модель вам подходит для непосредственного использования SynchronizationContext
, то обязательно используйте это (класс BackgroundWorker
использует SynchronizationContext
для внутреннего использования).