目前我正在将现有的C#Windows 8 / iOS应用程序移植到Android(使用Xamarin)。
我使用了很多async / await来处理文件IO,对话框,网络等...
在等待通话期间暂停/暂停应用时会发生什么? 在Windows和iOS下有两种可能性:
在这两种情况下,没有任何记事本泄漏,控制流程没有变化。
但是,在Android下,可以在进程保持活动状态时销毁并重新创建一个Activity。在我对async / await的理解中,这意味着:
我的假设是真的吗?如果是的话,可以做些什么? (不使程序像async / await发明那样复杂)
答案 0 :(得分:1)
Android活动保证在活动停用/销毁之前调用OnPause,并在启动时调用OnResume(参见http://developer.android.com/training/basics/activity-lifecycle/index.html)。
如果您的活动中有CancellationTokenSource,那该怎么办?然后在OnPause中,您可以调用取消,然后使用:
try
{
// Your async code
...
}
catch (OperationCancelledException e)
{
}
另请参阅http://msdn.microsoft.com/en-us/library/jj155759.aspx以取消异步任务。
更多的建议而不是明确的答案,但我希望它有所帮助。
编辑:
当我开始在我的代码中引入async / await时,我发现它就像一个僵尸病毒。一旦你开始异步,你会发现它在你的其余代码中传播。可能是因为同样的原因你有很多异步调用。通常有两条规则可供遵循:
public async Task Foo()
而不是public async void Foo()
在我自己的实践中,我发现了两个你可以违反这些一般规则的地方。
希望这有帮助。
答案 1 :(得分:0)
您可以使用服务来执行这些长时间运行的任务。另一个选择是使用无头片段(一个没有视图,并且.RetainInstance
属性设置为true
)。