У меня возникают некоторые проблемы при использовании обратного вызова в проекте WCF.
Сначала сервер вызывает на клиенте некоторую функцию Foo
, которая затем перенаправляет запрос в графический интерфейс Windows Forms:
GUI CLASS
delegate void DoForward();
public void ForwardToGui() {
if (this.cmdSomeButton.InvokeRequired) {
DoForward d = new DoForward(ForwardToGui);
this.Invoke(d);
}
else {
Process(); // sets result variable in callback class as soon as done
}
}
}
ЗВОНОК КЛАСС
object _m = new object();
private int _result;
public int result {
get { return _result; }
set {
_result = value;
lock(_m) {
Monitor.PulseAll(_m);
}
}
}
[OperationContract]
public int Foo() {
result = 0;
Program.Gui.ForwardToGui();
lock(_m) {
Monitor.Wait(_m, 30000);
}
return result;
}
Проблема в том, что пользователь должен иметь возможность отменить процесс, который не работает должным образом:
СЕРВЕРНЫЙ ИНТЕРФЕЙС
[OperationContract]
void Cleanup();
GUI CLASS
private void Gui_FormClosed(object sender, EventArgs e) {
Program.callbackclass.nextAction = -1;
// so that the monitor pulses and Foo() returns
Program.server.Cleanup();
}
Проблема в том, что Cleanup()
зависает. Однако, когда я закрываю форму, когда Process()
не запущен, он работает правильно.
Похоже, источником является то, что Cleanup()
вызывается до импульсов монитора и т. Д., И поэтому новый запрос отправляется на сервер до того, как последний запрос от сервера еще не был получен.
Как я могу решить эту проблему? Как я могу убедиться перед вызовом Cleanup()
, что Foo()
в данный момент не выполняется?