Próbuję załadować i odczytać plik ustawień po uruchomieniu aplikacji, a około 90% czasu, await GetFileAsync("filename.xml");
nigdy nie zwraca, a więc zawiesza aplikację .Zadzwoń, aby czekać na GetFileAsync() nigdy nie wraca i aplikacja zawiesza się w aplikacji WinRT
Około jedna czwarta czasu, jeśli przejdę przez ten kod, wróci on i odczyta plik.
Oto bardzo uproszczona wersja kodu:
App.xaml.cs:
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
FileLoader.Load().Wait();
// File-load dependent stuff
}
FileLoader.cs:
public async static Task Load()
{
StorageFolder folder = ApplicationData.Current.LocalFolder;
StorageFile file;
bool fileExists = true;
try
{
// The following line (often) never returns
file = await folder.GetFileAsync("filename.xml");
{
catch
{
fileExists = false;
}
// Do stuff with loaded file
}
Gdybym obserwować okno Output w Visual Studio , po chwili oczekiwania dostaję "The thread '<No Name>' (0x30c) has exited with code 0 (0x0)."
Czy ktoś ma jakiś pomysł co tu się dzieje?
Blokujesz wątek interfejsu użytkownika, o ile widzę, dzwoniąc do 'Czekaj'. To naprawdę zły pomysł. Heck, to może być przyczyna problemu. –
Myślę, że Jon ma całkowitą rację - czy masz szansę zaznaczyć OnLaunched jako async, a następnie poczekać na wywołanie Load()? Jeśli nie możesz, innym rozwiązaniem może być ładowanie, aby wykonać działanie po zakończeniu obciążenia, a następnie uruchom działanie na końcu (lub, oczywiście, możesz użyć metody ContinueWith na zadaniu, które Load() zwraca tak jak przed zrobieniem/czekaniem :) –
Obaj mieliście rację, Jon i James. Dziękuję bardzo za wkład! Pierwotnie używałem 'Wait', ponieważ nie zdawałem sobie sprawy, że możesz dodać' async' do przesłoniętej metody i nie wiedziałem, że 'OnLaunched' działa w wątku UI. Usunięcie 'Wait' i dodanie' async' do 'OnLaunched' naprawiło to! Chciałbym móc zaznaczyć twoje komentarze jako odpowiedź. – jokeefe