Однотонные нитки, GC, WCF - PullRequest
3 голосов
/ 12 мая 2010

Это вопрос о передовой практике, я думаю, но он относится непосредственно к моему текущему проекту MT.

Я использую сервисы WCF для связи с сервером.

Для этого я делаю следующее:

services.MethodToCall(params);

и асинхронность:

services.OnMethodToCallCompleted += delegate{
    //do stuff and ting
};

Это может привести к проблемам, если вы не будете осторожны в том, что переменные, определенные в области асинхронного обратного вызова, иногда могут быть очищены gc, и это может вызвать сбои.

Итак, я практикую объявлять их вне области обратного вызова, если я не уверен на 100%, что они не нужны.

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

Несмотря на то, что я осторожен со всем этим, у меня все еще случаются сбои, и я понятия не имею, почему!

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

Теперь - единственное, о чем я могу подумать, кроме обновления пользовательского интерфейса, которое может потребоваться в InvokeOnMainThread, - это наличие у меня одноэлементного класса Database. Это основано на версии кода 5 из этой темы http://www.yoda.arachsys.com/csharp/singleton.html

Так что теперь, если метод сервиса возвращает данные, которые необходимо добавить / обновить в классе Database, - я также заключаю их в вызов InvokeOnMainThread.

По-прежнему случаются случайные сбои.

Итак ... Мой вопрос такой:

Я новичок в толстом клиенте dev - я пришел с точки зрения веб-разработчика, где нам не нужно так сильно беспокоиться о потоках :) 10 *

Кроме того, что я упомянул - есть ли еще какие-то вещи, о которых я должен знать?

Все вышеперечисленное правильно? Или я чего-то не понимаю?

Приветствия

ш: //

1 Ответ

1 голос
/ 04 июля 2010

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

Я надеюсь, что этот ответ поможет кому-то еще в будущем.

Приветствие.

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