这里的基本设置是我具有独立于平台的代码,该代码进行REST调用,然后调用由平台特定的UI代码注册的事件处理程序,如果发生某些更改需要更新UI。这些事件处理程序必须在UI线程上执行。对于void调用来说,这一切看起来都非常简单,但是像这样的情况我不确定我是否做对了:
public override bool FinishedLaunching(UIApplication app,
NSDictionary options) {
/* Setup code removed */
Task task = BackendService.DoSomethingAsync();
return (true);
}
在iOS应用程序委托中。这是调用该异步任务并确保在运行时不阻止UI的正确方法吗?看来可行,但我不确定它是否会在线下随机炸毁。
答案 0 :(得分:1)
您可以创建事件处理程序
private event EventHandler LaunchFinished = delegate { };
然后使用FinishedLaunching
方法订阅并引发事件。
public override bool FinishedLaunching(UIApplication app, NSDictionary options) {
// subscribe to event with event handler
LaunchFinished += LaunchFinishedHandler;
// raise event
LaunchFinished(this, EventArgs.Empty);
return (true);
}
可以等待事件处理程序,因此它不会阻止UI线程
private async void LaunchFinishedHandler(object sender, EventArgs args) {
LaunchFinished -= LaunchFinishedHandler; //optional
// Setup code removed for brevity
//On UI Thread
await BackendService.DoSomethingAsync(); //non blocking await
//Back on UI thread
}
事件处理程序是允许async void
的一种情况。使用此模式还可以使您捕获调用异步函数可能引起的任何异常。
答案 1 :(得分:0)
如果您想使用“即发即弃”异步功能,请尝试以下方法;
public static class TaskExtensions
{
/// <summary>
/// It is used when you want to call an async method without
/// awaiting for it. Using this method suppresses the warning CS4014.
/// </summary>
/// <param name="task">Task to be called using a fire-and-forget call</param>
public static void Forget(this Task task)
{
task.ConfigureAwait(false);
}
}
然后您可以通过以下方式使用它:
YourActionName().Forget();