Какой поток вызывает обработчик завершенных событий при вызовах silverlight WCF? - PullRequest
5 голосов
/ 07 июня 2011

Предположим, что приложение Silverlight выполняет вызов службы WCF:

void DoStuff()
{
    MyProxy proxy = new MyProxy();
    proxy.DoStuffCompleted += DoStuffCompleted;
    proxy.DoStuffAsync();
}

void DoStuffCompleted(object sender, DoStuffCompletedEventArgs e)
{
    // Handle the result.
}

DoStuff вызывается потоком пользовательского интерфейса.Какой поток в итоге вызовет метод DoStuffCompleted?Если я вызываю два асинхронных вызова одновременно, есть ли вероятность того, что оба завершенных события будут запущены одновременно в разных потоках?

Ответы [ 3 ]

3 голосов
/ 08 июня 2011

Обратный вызов будет вызываться в главном потоке.Многократные ответы не будут происходить одновременно.Порядок событий ответа может быть неожиданным.Вы можете захотеть использовать перегрузку proxy.DoStuffAsync, которая принимает объект «пользовательское состояние»:

proxy.DoStuffAsync(object userState)

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

Обновление:

Найдены ещеинформация (о SO) о том, как заставить его использовать другую ветку:

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

1 голос
/ 07 июня 2011

Событие Completed будет происходить в потоке, отличном от потока пользовательского интерфейса.Несколько завершенных событий могут выполняться одновременно в разных потоках, поскольку для обработки результатов используется пул потоков.

0 голосов
/ 07 июня 2011

Асинхронные вызовы выполняются в фоновом пуле потоков .Для каждого асинхронного вызова у вас должен быть отдельный поток из пула.

DoStuffCompleted будет выполняться в фоновом потоке пула.

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

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