我猜这是一个关于最佳实践的问题,但它直接适用于我当前的 MT 项目。
我正在使用 WCF 服务与服务器通信。
为此,我执行以下操作:
services.MethodToCall(params);
和异步:
services.OnMethodToCallCompleted += delegate{
//do stuff and ting
};
如果您不小心,这可能会导致问题,因为在异步回调范围内定义的变量有时会被 gc 清除,这可能会导致崩溃。
所以 - 我习惯于在回调范围之外声明这些,除非我 100% 确定不需要它们。
现在 - 当做一些事情并且 ting 意味着改变 ui - 我将它全部包装在一个 InvokeOnMainThread 调用中。我想将所有内容都包含在其中会减慢主线程的速度并破坏拥有多线程的意义。
尽管我对这一切都很小心,但我仍然遇到崩溃,我不知道为什么!
我确定它与线程、作用域等有关。
现在 - 除了更新可能需要在 InvokeOnMainThread 内部发生的 UI 之外,我唯一能想到的就是我有一个单例“数据库”类。这是基于来自此线程的版本 5 代码 http://www.yoda.arachsys.com/csharp/singleton.html
现在,如果服务方法返回需要添加/更新到数据库类的数据 - 我还将其包装在 InvokeOnMainThread 调用中。
仍然遇到随机崩溃。
所以...我的问题是:
我是胖客户端开发的新手 - 我是从网络开发的角度出发的,我们不需要太担心线程:)
除了我提到的以外,还有什么我应该注意的吗?
以上内容是否正确?还是我误解了什么?
干杯
w://
最佳答案
仅供引用,我们通过在应用程序完成启动时保留对原始 Controller 的引用(在我们的例子中是导航 Controller )来克服这个困难。我们面临的问题是 GC 正在清理 Controller ,因为它认为这是不必要的,因为它们是在方法的范围内声明的。
我希望这个答案对以后的其他人有所帮助。
干杯。
关于c# - Monotouch 线程、GC、WCF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2817310/