Если пользователь приложения решит закрыть приложение, проведя пальцем вверх, я хотел бы уведомить аппаратное устройство о том, что канал связи должен быть закрыт. Проблема в том, что эта связь представляет собой асинхронную операцию, занимающую от 500 до 1500 мс. Меня не волнует ответ от аппаратного устройства, так как у меня все равно нет времени действовать по нему из-за моего 5-секундного окна до завершения процесса приложения, но я хотел бы убедиться, что «shutdown Операция " отправляется на устройство.
До сих пор я пытался запустить ее синхронно, но приложение вылетало, когда я помещал .Wait() на Task.Run — без .Wait() сообщение «выключение» никогда не отправляется на устройство. Как мне обеспечить передачу этого асинхронного вызова на аппаратное устройство?
Android:
Код: Выделить всё
protected override void OnDestroy()
{
Task.Run(() => _appRestartService?.ShutDown()).Wait();
base.OnDestroy();
}
Код: Выделить всё
public override void WillTerminate(UIApplication application)
{
Task.Run(() => _appRestartService?.ShutDown()).Wait();
}
Код: Выделить всё
System.AggregateException: One or more errors occurred. (A task was canceled.) ---> System.Threading.Tasks.TaskCanceledException: A task was canceled.
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional (System.Boolean includeTaskCanceledExceptions) [0x00013] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs:2029
at System.Threading.Tasks.Task.Wait (System.Int32 millisecondsTimeout, System.Threading.CancellationToken cancellationToken) [0x00043] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs:2759
at System.Threading.Tasks.Task.Wait () [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs:2625
at NameSpace.AppDelegate.WillTerminate (UIKit.UIApplication application) [0x00001] in /Users/X/src/App/AppProjectName/AppDelegate.cs:128
at (wrapper managed-to-native) UIKit.UIApplication.xamarin_UIApplicationMain(int,intptr,intptr,intptr,intptr&)
at UIKit.UIApplication.UIApplicationMain (System.Int32 argc, System.String[] argv, System.IntPtr principalClassName, System.IntPtr delegateClassName) [0x00008] in /Library/Frameworks/Xamarin.iOS.framework/Versions/16.4.0.6/src/Xamarin.iOS/UIKit/UIApplication.cs:58
at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00013] in /Library/Frameworks/Xamarin.iOS.framework/Versions/16.4.0.6/src/Xamarin.iOS/UIKit/UIApplication.cs:84
at AppProjectName.Application.Main (System.String[] args) [0x00002] in /Users/X/src/App/AppProjectName/Main.cs:18
---> (Inner Exception #0) System.Threading.Tasks.TaskCanceledException: A task was canceled.
Подробнее здесь: [url]https://stackoverflow.com/questions/77006136/how-to-perform-critical-operation-on-app-termination-ios-willterminate-androi[/url]