这是一个关于我猜的最佳实践的问题,但它直接适用于我目前的MT项目。
我正在使用WCF服务与服务器进行通信。
要执行此操作,请执行以下操作:
services.MethodToCall(params);
和asynch:
services.OnMethodToCallCompleted += delegate{
//do stuff and ting
};
如果您不小心在asynch回调范围内定义的变量有时会被gc清除,这会导致崩溃,这可能会导致问题。
所以 - 除非我100%确定不需要它们,否则我将这些声明放在回调范围之外。
现在 - 当做东西和Ting暗示改变ui时 - 我将它全部包装在InvokeOnMainThread调用中。我想在这里包装所有东西会减慢主线程的速度,并且会使多线程变得无用。
即使我对所有这些都很小心我仍然会崩溃,但我不明白为什么!
我确信它与线程,范围和所有这些有关。
现在 - 除了更新可能需要在InvokeOnMainThread内部发生的UI之外,我唯一能想到的就是我有一个单独的'Database'类。这基于此线程http://www.yoda.arachsys.com/csharp/singleton.html
的第5版代码现在,如果服务方法返回需要添加/更新到Database类的数据 - 我也将它包装在InvokeOnMainThread调用中。
仍然随机崩溃。
所以......我的问题是:
我是胖客户端的新手 - 我是从Web开发的角度出发的,我们不需要太担心线程了:))
除了我所提到的 - 还有其他我应该注意的事情吗?
上述内容是否正确?或者我想念一些事情吗?
干杯
瓦特://
答案 0 :(得分:1)
仅供参考,我们通过在应用程序完成启动时保留对原始控制器的引用(在我们的例子中是导航控制器)来克服这个驼峰。我们面临的问题是GC正在清理控制器,因为它认为这是不必要的,因为它们是在方法范围内声明的。
我希望这个答案可以帮助其他人。
干杯。