Tomasz Janczuk также указал , что, если поток пользовательского интерфейса довольно занят, вы можете значительно улучшить производительность даже асинхронных вызовов WCF, направляя их в отдельный поток. И я должен отметить, что поток пользовательского интерфейса может быть ужасно занят тем, что вы не ожидаете, что он будет переживать циклы, такие как вычисление теней и тому подобное, поэтому это может стоить исследовать (и измерить) для вашего приложения. 1003 *
Тем не менее, я писал LOB-приложения большую часть двух десятилетий, и кроме синхронного ввода-вывода, я не нашел много сценариев, в которых добавление нескольких потоков в LOB-приложение стоило бы дополнительной сложности.
Редактировать 04.02.10: на днях я пообедал с Томашем Янчуком и некоторыми другими людьми из команды WCF, и они разъяснили мне несколько вопросов о том, как WCF работает с фоновыми потоками Silverlight. Есть две вещи, которые нужно учитывать: отправка данных и их получение (скажем, от дуплексных обратных вызовов или завершений асинхронных вызовов). Когда вы отправляете данные, вызов всегда будет выполняться из потока, который на самом деле делает вызов. Поэтому, если у вас много данных, которые необходимо сериализовать, вы можете получить небольшое повышение производительности, перенаправив исходящий вызов в фоновый поток (скажем, с помощью ThreadPool.QueueUserWorkItem). Но вряд ли это будет существенное повышение производительности.
Однако, когда вы получаете данные либо через дуплексный обратный вызов, либо через асинхронный метод xxxCompleted, данные всегда принимаются в потоке, в котором первоначально было открыто соединение. Это означает, что если вы открываете соединение явно, оно получит данные в этом потоке; но если вы неявно открываете соединение, оно получит данные о потоке, в котором вы установили свое первое исходящее соединение. Это не будет иметь большого значения, если вам нужно будет обновлять пользовательский интерфейс при каждом обратном вызове, поскольку вам нужно будет просто перенаправить обратный вызов в поток пользовательского интерфейса. Но если есть моменты, когда вам просто нужно сохранить данные для будущей ссылки или обработки, вы можете значительно повысить производительность, открыв соединение в отдельном потоке, чтобы вы могли получать и обрабатывать обратные вызовы, не ожидая в потоке пользовательского интерфейса .
Надеюсь, это поможет. Думал, что я запишу это, пока у меня все еще свежо в голове.