在Android下异步/等待不良做法?

eik*_*kuh 6 c# android xamarin.android async-await xamarin

目前我正在将现有的C#Windows 8/iOS应用程序移植到Android(使用Xamarin).

我使用了很多异步/等待文件IO,对话框,网络等...

当应用程序在等待呼叫期间暂停/暂停时会发生什么?在Windows和iOS下有两种可能性:

  • 该应用程序稍后恢复,好像什么也没发生过
  • 如果内存不足,应用程序将被终止.

在这两种情况下,没有任何记事本泄漏,控制流程没有变化.

但是,在Android下,可以在进程保持活动状态时销毁并重新创建一个Activity.在我对async/await的理解中,这意味着:

  • 一个未关闭的对话框将永远等待,这意味着可以从调用者访问的对象("t​​his",局部变量等)将永远保留在内存中(内存泄漏)
  • 当一个等待的网络请求完成而前一个活动已被Android销毁时,"等待"(例如文件写入)之后的代码可能会发生冲突,因为存在两个正在运行的Activity实例.

我的假设是真的吗?如果是的话,可以做些什么?(不使程序像async/await发明那样复杂)

Dav*_*ave 1

Android Activity 保证在停用/销毁之前调用 OnPause,并在启动时调用 OnResume(请参阅http://developer.android.com/training/basics/activity-lifecycle/index.html)。

如果您的 Activity 有可用的 CancellationTokenSource 怎么样?然后在 OnPause 中你可以调用 Cancel 然后使用:

try
{
    // Your async code
    ...
}
catch (OperationCancelledException e)
{
}
Run Code Online (Sandbox Code Playgroud)

另请参阅http://msdn.microsoft.com/en-us/library/jj155759.aspx以了解取消异步任务。

更多的是建议而不是明确的答案,但我希望它有所帮助。

编辑:

当我开始在代码中引入 async/await 时,我发现它就像僵尸病毒。一旦开始异步,您就会发现它会传播到代码的其余部分。出于同样的原因,您可能会收到很多异步调用。一般有两条规则需要遵循:

  1. 将方法声明为public async Task Foo()而不是public async void Foo()
  2. 不要阻塞异步代码

在我自己的实践中,我发现了两个可以打破这些一般规则的地方。

  1. 如果您位于代码的“顶部”(即 UI),则可能在某些地方必须将代码声明为 async void,因为您要重写的委托将 void 作为返回类型。一个典型的例子是使用 Button.Click 方法。
  2. 我有一个数据库调用,它在数据库中查找单个值。如果我将其转换为异步,其他地方的许多代码都必须更改。我发现,如果您保证(我的意思是保证)位于代码的“底部”,特别是您调用的方法下面的方法都没有使用异步,那么您可以安全地在 a 上调​​用 .Result任务。这使我免于不必要地异步一半代码。

希望这可以帮助。