Обеспечение того, чтобы все обратные вызовы были завершены перед отправкой нового запроса через DuplexChannel с использованием WCF - PullRequest
0 голосов
/ 26 мая 2010

У меня возникают некоторые проблемы при использовании обратного вызова в проекте 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() в данный момент не выполняется?

1 Ответ

0 голосов
/ 27 мая 2010

Первое предупреждение, которое я вижу, это то, что вы звоните Invoke вместо BeginInvoke

Invoke ожидает завершения действия в другом потоке перед возвратом, что может привести к тупику в некоторых ситуациях.

...