События WCF на стороне сервера - PullRequest
0 голосов
/ 19 декабря 2010

Я работаю над приложением в WCF и хочу получать события на стороне сервера.

У меня есть веб-сайт, который по запросу должен зарегистрировать отпечаток пальца.Веб-страница запрашивает подключение устройства, а затем каждую секунду в течение 15 секунд запрашивает ответ.

Код на стороне сервера, по-видимому, «простой», но не работает.это:

[ServiceContract]
interface IEEtest
{
    [OperationContract]
    void EEDirectConnect();
}

class EETest : IEEtest
{
    public void EEDirectConnect()
    {
        CZ ee = new CZ(); // initiates the device dll

        ee.Connect_Net("192.168.1.200", 4011);

        ee.OnFinger += new _IEEEvents_OnFingerEventHandler(ee_OnFinger);

    }

    public void ee_OnFinger()
    {
        //here i have a breakpoint;
    }
}

каждый раз, когда я кладу палец, должно срабатывать событие.на самом деле, если я

static void Main() 
{
    EETest pp = new EETest();
    pp.EEDirectConnect();
}

работает нормально.но из моего прокси-сервера оно не запускает событие.

У вас есть какие-либо советы, рекомендации или вы видите ошибку?

Спасибо всем.

1 Ответ

0 голосов
/ 26 декабря 2010

Я вижу две проблемы с вашим кодом, которые могут быть, а могут и не быть проблемой.

A) Условия гонки регистрации событий

Вы вызываете CZ.Connect_Net () и ТОГДА вы регистрируетесь.с обработчиком событий.Поэтому, если ваше событие происходит между вызовом Connect_Net () и регистрацией метода для обработки события, вы его не увидите.Сначала зарегистрируйте обработчик событий, а затем вызовите Connect_Net ().

B) Время жизни EEtest.

Время жизни вашего класса EEtest зависит от режима Instancing, который вы используете в WPF, см. http://mkdot.net/blogs/dejan/archive/2008/04/29/wcf-service-behaviors-instance-and-concurrency-management.aspx. Обычно по умолчанию используется Per-Call, что означает, что новый экземпляр EEtest создается только для обслуживания вызова EEDirectConnect.Поэтому, когда вы вызываете метод EEDirectConnect, вы получаете следующее:

  1. Запущен вызов EEDirectConnect.
  2. WCF создает новый класс EEtest.
  3. WCF вызывает метод на EEtest.
  4. Метод выдает новость CZ и вызывает метод Connect-net.
  5. Обработчик событий прилагается.
  6. Метод EEDirectConnect завершается.
  7. EEtest теперь "unroot" WCF - он имеет право на GC, и, следовательно, CZ имеет право на GC.

Так что, возможно, это займет очень короткое время (или синхронно)и проблема в A, или она асинхронная и занимает немного больше времени, и это B.

Кстати: для исправления B вы можете использовать какой-то механизм синхронизации (например, Event) для блокировки до тех пор, пока не сработает ee_Onfinger.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...