Одна важная вещь, которую нужно понять, если вы используете асинхронные вызовы, это то, что по-прежнему нет способа отменить запрос и предотвратить ответ, возвращающийся из службы после его запуска. Ваш пользовательский интерфейс должен быть умным в обработке ответов, чтобы избежать условий гонки. К счастью, есть простой способ сделать это.
Этот пример предназначен для поиска заказов, управляемых пользовательским интерфейсом. Предположим, что для возврата результатов может потребоваться несколько секунд, и пользователь выполняет два поиска вплотную.
Поэтому, если ваш пользователь запускает два поиска и первый поиск возвращается после второго - вам нужно убедиться, что вы не отображаете результаты первого поиска.
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);