Попытка обернуть мою голову вокруг того, почему Windows Form, реализующая обратный вызов, не работает.Обратные вызовы в SynchronizationContext
То, что я пытаюсь сделать:
- кнопка нажата, и услуга называется.
- Служба перезванивает к форме (функция имеет IsOneWay = истина)
- ГИП обновления формы соответственно
Имея UseSynchronizationContext на лжи и вызов Invoke на членах GUI работает отлично:
[CallbackBehavior(UseSynchronizationContext = false)]
public class DeliveryClient : System.Windows.Forms.Form, ICallback
{
public void ServiceCallback(string system, string state, string extraInfo)
{
if (state == "start")
{
Invoke((MethodInvoker)delegate { picBox.Visible = true; });
}
else
{
Invoke((MethodInvoker)delegate { picBox.Visible = false; });
}
}
}
Но UseSynchronizationContext = истина и прямой вызов членов нет:
[CallbackBehavior(UseSynchronizationContext = true)]
public class DeliveryClient : System.Windows.Forms.Form, ICallback
{
public void ServiceCallback(string system, string state, string extraInfo)
{
if (state == "start")
{
picBox.Visible = true;
}
else
{
picBox.Visible = false;
}
}
Ни делает с помощью SyynchronizationContext буквально
SynchronizationContext.Current.Send(_=> picBox.Visible = true, null);
Если вторая и третья версия также работает? Обратный вызов называется OneWay, поэтому услуга продолжается после обратного вызова.
обратное обращение корректно да, форма реализует обратный вызов.Я попытаюсь сохранить SynContext сейчас – Laurijssen
Действительно, сохранение SynContext после работы InitializeComponent – Laurijssen
Я не согласен с ситуацией на самом деле. Форма, использующая обратный вызов, единственная цель которого - обновить форму, выглядит нормально для меня – Laurijssen