как отменить сервисный звонок WCF? - PullRequest
1 голос
/ 04 июня 2009

У меня есть функция WCF, которая выполняется долгое время, поэтому я вызываю эту функцию в пользовательском интерфейсе с помощью backgraundworker ... Я хочу дать возможность отменить выполнение, поэтому я отменяю IComunicationObject, проблема в том, что выполнение службы не остановка, есть ли способ остановить выполнение службы в этом случае?

Ответы [ 3 ]

2 голосов
/ 04 июня 2009

Вам может не понадобиться BackgroundWorker. Вы можете либо выполнить операцию IsOneWay, либо реализовать асинхронный шаблон . Чтобы избежать проблем с многопоточностью, рассмотрите использование SynchronizationContext . Программирование служб WCF отлично объясняет их.

2 голосов
/ 11 июля 2011

Одна важная вещь, которую нужно понять, если вы используете асинхронные вызовы, это то, что по-прежнему нет способа отменить запрос и предотвратить ответ, возвращающийся из службы после его запуска. Ваш пользовательский интерфейс должен быть умным в обработке ответов, чтобы избежать условий гонки. К счастью, есть простой способ сделать это.

Этот пример предназначен для поиска заказов, управляемых пользовательским интерфейсом. Предположим, что для возврата результатов может потребоваться несколько секунд, и пользователь выполняет два поиска вплотную.

Поэтому, если ваш пользователь запускает два поиска и первый поиск возвращается после второго - вам нужно убедиться, что вы не отображаете результаты первого поиска.

   private int _searchRequestID = 0; // need one for each WCF method you call


   // Call our service...
   // The call is made using the overload to the Async method with 'UserToken'.
   // When the call completes we check the ID matches to avoid a nasty
   // race condition
   _searchRequestID = _searchRequestID++;
   client.SearchOrdersCompleted += (s, e) =>
   {
       if (_searchRequestID != (int)e.UserState))
       {
           return; // avoid nasty race condition
       }

       // ok to handle response ...
    }
    client.SearchOrdersAsync(searchMessage, _searchRequestID);
2 голосов
/ 04 июня 2009

Создайте метод CancelOperation (), который устанавливает статический ManualResetEvent в вашем сервисе. Проверяйте это событие в вашем методе работы часто. Или это может быть CancelOperation (Guid operationId), если ваша служба может обрабатывать несколько вызовов операций одновременно.

...