Это вопрос о передовой практике, я думаю, но он относится непосредственно к моему текущему проекту 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 *
Кроме того, что я упомянул - есть ли еще какие-то вещи, о которых я должен знать?
Все вышеперечисленное правильно? Или я чего-то не понимаю?
Приветствия
ш: //