Chcę załadować niektóre dane w konstruktorze ViewModel, ale z powodu asynchronicznej natury WinRT zmuszony jestem użyć metod asynchronicznych. Niestety nie mogę mieć konstruktora asynchronicznego, więc próbuję użyć metody asynchronicznej jako metody synchronicznej. Jestem pewien, że istnieje znacznie lepszy sposób ładowania danych (asynchronizacja) przy ładowaniu aplikacji, ale mój umysł jest teraz pusty.WinRT asynchroniczne ładowanie danych w konstruktorze
Poszukuję sposobu na naprawienie mojej aplikacji za pomocą linii myślenia, którą zamierzam rozwiązać, lub naprawienia tego na stałe za pomocą bardziej odpowiedniej metody.
Kod jest bardzo prosty (nawet brakuje modelu ViewModel) tylko po to, aby zademonstrować problem, z którym się spotykam.
public sealed partial class MainPage : Page
{
public string Data { get; set; }
public DataService _dataService { get; set; }
public MainPage()
{
this.InitializeComponent();
_dataService = new DataService();
var t = _dataService.GetData();
Data = t.Result;
}
/// <summary>
/// Invoked when this page is about to be displayed in a Frame.
/// </summary>
/// <param name="e">Event data that describes how this page was reached. The Parameter
/// property is typically used to configure the page.</param>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
}
}
public class DataService
{
public async Task<string> GetData()
{
//Force async
await Task.Delay(1);
return "Hello";
}
}
poważaniem
Należy pamiętać o obsłudze błędów. Jeśli 'Task' zwrócony przez metodę inicjowania' async' nigdy nie zostanie zaobserwowany, wszelkie wyjątki będą po cichu połknięte. Dlatego upewnij się, że masz 'try' /' catch' w swoim 'InitializeAsync' lub masz inną metodę' oczekuj' na wynik. –
Oczywiście. Odnosi się to niezależnie od tego, czy wywołanie odbywa się w inicjatorze, czy w innej metodzie, która może prowadzić do złego stanu. –