Ich versuche, meinen Kopf darum herumzuwerfen, warum ein Windows-Formular, das einen Callback implementiert, nicht funktioniert.Callbacks auf SynchronizationContext
Was ich versuche zu tun:
- wird eine Taste gedrückt und ein Dienst aufgerufen wird.
- Der Service zum Formular ruft zurück (die Funktion hat IsOneWay = true)
- Das Formular Updates GUI entsprechend funktioniert
UseSynchronizationContext auf falschen und ruft Invoke auf die GUI-Elemente mit:
[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; });
}
}
}
Aber UseSynchronizationContext = true und direkt die Mitglieder Aufruf nicht:
[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;
}
}
Weder SyynchronizationContext buchstäblich
SynchronizationContext.Current.Send(_=> picBox.Visible = true, null);
Sollte die zweite und die dritte Version arbeitet auch nicht mit? Der Rückruf wird OneWay genannt, so dass der Dienst nach dem Rückruf fortgesetzt wird.
das Callback-Verhalten ist richtig platziert ja, das Formular implementiert den Rückruf.Ich werde versuchen, den SynContext jetzt speichern – Laurijssen
In der Tat, die Speicherung der SynContext nach InitializeComponent funktioniert – Laurijssen
Ich stimme nicht mit dem sep von Bedenken tatsächlich. Ein Formular, das einen Callback implementiert, dessen einziger Zweck es ist, das Formular zu aktualisieren, sieht für mich in Ordnung – Laurijssen