Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public static class Execute
{
private static Action<Action> executor = action => action();
public static void InitializeWithSynchronizationContext()
{
var context = SynchronizationContext.Current;
if (context == null)
{
throw new InvalidOperationException("Unable to initialize synchronization context");
}
executor = action =>
{
if (Equals(context, SynchronizationContext.Current))
{
action();
}
else
{
SendAction(context, action);
}
};
}
public static void OnUIThread(this Action action)
{
executor(action);
}
private static void SendAction(SynchronizationContext context, Action action)
{
ExceptionDispatchInfo exceptionDispatchInfo = null;
context.Send(state =>
{
try
{
action();
}
catch (Exception ex)
{
exceptionDispatchInfo = ExceptionDispatchInfo.Capture(ex);
}
}, null);
if (exceptionDispatchInfo != null)
{
exceptionDispatchInfo.Throw();
}
}
}
В рамках одного потока это работает – сообщения приходят, форма их получает, данные обновляются. При добавлении же еще нескольких, наша функция SendNotificationToForm начинает вести не совсем так, как ожидалось. Сообщения приходят и форма их получат, вот только складывает их в очередь для обновления контента и пока ваши background потоки не закончат работу, не спешит выводить на экран. И чем более сложной задачей заняты вы в других потоках, тем нагляднее это проявляется.Не верю — никогда не сталкивался с подобным. Сообщения всегда приходили вовремя, сколько бы потоков я не создавал.
public override void Post(SendOrPostCallback d, object state)
{
if (this.controlToSendTo == null)
return;
this.controlToSendTo.BeginInvoke((Delegate) d, new object[1]
{
state
});
}
Windows Forms & Invoke from parallel threads