Использование WCF CloseAsync в silverlight - PullRequest
3 голосов
/ 08 сентября 2010

Является ли это правильным подходом для закрытия соединений с WCF в silverlight?

ServiceClient client = new ServiceClient();

        client.MakeRequestCompleted += (sender, e) =>
            {
                client.CloseAsync();

                //some implementation goes here
            };

        for (int i = 0; i < 1000; i++)
        {
            client.MakeRequestAsync();
        }

Кажется, у меня возникают проблемы, связанные с одновременными подключениями, когда цикл достигает 300 запросов, он просто не работает. Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Эта ссылка говорит, что вам не нужно закрывать запрос: http://forums.silverlight.net/forums/p/29299/95656.aspx


1: ServiceClient client = new ServiceClient();
2: client.MakeRequestCompleted += (sender, e) =>...
3: client.MakeRequestAsync();

MakeRequestCompleted является делегатом. После завершения запроса вызов выполняется.

Если вы сделаете строки 1 и 2 общими для всего запроса, вы должны связать одно и то же событие с одинаковыми аргументами для каждого запроса. Затем в коде реализации вы не знаете, какой вызов вызвал какое событие. [1]

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

Итак, можете ли вы проверить, насколько сильно страдает производительность, если вы просто сделаете все эти строки для каждого запроса?

for (int i = 0; i < 1000; i++)
{
    ServiceClient client = new ServiceClient();
    client.MakeRequestCompleted += (sender, e) =>...
    client.MakeRequestAsync();
} 

(Тогда, конечно, вы должны использовать кеш и использовать меньше запросов.)


[1]: Это может быть хорошо, если вы создаете просто «молоток-клиент», подобный этому, но если вам нужна некоторая реальная реализация, общих аргументов событий может быть недостаточно.

0 голосов
/ 12 октября 2010

Я не эксперт, но я исследовал подобную проблему, и никто больше не оставил ответ ...

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

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

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