2010-05-12 5 views
3

Это вопрос о лучших практиках, о которых я думаю, но он применим непосредственно к моему текущему проекту MT.Monotouch threads, GC, WCF

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

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

services.MethodToCall(params); 

и асинхронная:

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

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

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

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

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

Я уверен, что это имеет какое-то отношение к темам, сфере охвата и тому подобное.

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

Итак, теперь, если метод службы возвращает данные, которые необходимо добавить/обновить в класс базы данных - я также обернул это внутри вызова InvokeOnMainThread.

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

Итак ... Мой вопрос заключается в следующем:

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

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

Правильно ли это указано? Или мне что-то не хватает?

Приветствия

ш: //

+0

Уэйн, можете ли вы дать больше контекста, больше кода? в общем, то, что вы делаете, прекрасно, так что было бы хорошо увидеть полный образец. вы создали реестр? –

+0

Оказалось, что я отклонил модальный вид из контекстного модального вида: this.dismissmodalviewcontroller(); Теперь это обычно не проблема, за исключением того, что перед этим я запускал событие: ModalViewDismissing(); В тех случаях, когда это событие прослушивалось - возникла проблема. Все хорошо сейчас :) – iwayneo

ответ

1

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

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

Cheers.

+0

спасибо за то, что вернулись с этим - это было проблемой для справки. Моя была немного яснее, когда я понял, что происходит. – iwayneo

Смежные вопросы