Ich versuche, eine einfache App, die ich auf Windows Phone 8 auf Universal Windows ausgeführt hatte, zu portieren. Ich habe ein paar Dateien, die ich (lokal) laden muss, bevor ich den Hauptrahmen/die Haupseite erstelle, da diese anweisen, wie man die Seite an erster Stelle erstellt. Es gibt eine .XML- und einige Inhaltsdateien, die Teil von Assets sind.Universal Windows, C#, erwarten während App-Initialisierung
Ich habe die Initialisierung während der App.Application_Launching() durchgeführt, die ich jetzt denke, wird von App.OnLaunched() ersetzt. Das Problem liegt in der neuen asynchronen Datei-IO. Ich kann keinen Ort finden, an dem ich Async-APIs aufrufen kann, ohne dass das Programm hängen bleibt. Es scheint, dass irgendwo in App.OnLaunched(), MainPage.MainPage(), MainPage.OnNavigatedTo() usw. kann ich nicht erwarten.
Ich muss im Grunde ein Hintergrund-Thread abfeuern, um eine Aufgabe zu planen, die später ausgeführt wird, um die eigentliche Initialisierung auszuführen, und dann zurück in den MainPage-Pool zu rufen, um etwas korrekt auszuführen. Der resultierende Code sieht ungefähr wie folgt aus. Scheint übermäßig komplex, aber ich denke, das ist richtig?
Danke, Nick.
public partial class MainPage : Page
{
// Constructor
public MainPage()
{
InitializeComponent();
// This doesn't work ...
// var task = InitAsync();
// task.Wait()
// This seems to ...
IAsyncAction asyncAction = ThreadPool.RunAsync((workItem) =>
{
var ignored = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() =>
{
TryInitAsync();
});
});
}
private async void TryInitAsync()
{
try
{
await InitAsync();
}
catch
{
int foo = 0;
}
}
private async Task<Boolean> InitAsync()
{
// Things that go await in the night
// Other things that update the layout
return true;
}
}
Ah, das ist es, was ich suchte. Im Prinzip etwas, das zu einem späteren Zeitpunkt auf dem UI-Thread geplant werden kann. – user3799309
_ "etwas, das zu einem späteren Zeitpunkt auf dem UI-Thread zurückgestellt werden kann" _ - das ist die Methode 'RunAsync()' des Dispatchers. Es ist nicht der beste Weg, weil das den UI-Thread immer noch blockieren wird (genau wie beim direkten Aufruf vom Konstruktor), aber es könnte für Sie funktionieren. –