1

私の Windows Phone 8 アプリケーションでは、ファイル MainViewModel.cs に LoadData() メソッドがあります。

このメソッドは、エンティティ フレームワークを使用して WCF サービスからデータを読み込みます...

次に、自分のページで LoadData() を呼び出します

LoadData() メソッド:

public void LoadData()
{
    client.GetMoviesCompleted += new EventHandler<ServiceReference1.GetMoviesCompletedEventArgs>(client_GetMoviesCompleted);
    client.GetMoviesAsync();

    client.GetTheatersCompleted += new EventHandler<ServiceReference1.GetTheatersCompletedEventArgs>(client_GetTheatersCompleted);
    client.GetTheatersAsync();

    this.IsDataLoaded = true;
}

メソッドで:

private void client_GetMoviesCompleted(object sender, ServiceReference1.GetMoviesCompletedEventArgs e)
{
    Movies = e.Result;
}

private void client_GetTheatersCompleted(object sender, ServiceReference1.GetTheatersCompletedEventArgs e)
{
    Theaters = e.Result;
}

次に、私のページで:

 App.ViewModel.LoadData();

問題は、データがロードされるまで待たないことです。

LoadData() メソッドの Async/Await を使用して、データがロードされるまで待機する方法を教えてください。

ありがとう

4

4 に答える 4

4

したがって、既存のメソッドをイベントベースのモデルからタスクベースのモデルに変換するこれら 2 つのメソッドから始めます。それらを完全に複製するのに十分な情報がないため、型に合わせて少し変更する必要がありますが、残りの変更は小さいはずです。

public static Task<Movie[]> WhenGetMovies(MyClient client)
{
    var tcs = new TaskCompletionSource<Movie[]>();
    Action<object, Movie[]> handler = null;
    handler = (obj, args) =>
    {
        tcs.SetResult(args.Result);
        client.GetMoviesCompleted -= handler;
    };
    client.GetMoviesCompleted += handler;
    client.GetMoviesAsync();
    return tcs.Task;
}
public static Task<Theater[]> WhenGetMovies(MyClient client)
{
    var tcs = new TaskCompletionSource<Theater[]>();
    Action<object, Theater[]> handler = null;
    handler = (obj, args) =>
    {
        tcs.SetResult(args.Result);
        client.GetTheatersCompleted -= handler;
    };
    client.GetTheatersCompleted += handler;
    client.GetTheatersAsync();
    return tcs.Task;
}

これらの非同期操作の完了を表すタスクを取得できるようになったので、データのロードは簡単です。

public async Task LoadData()
{
    var moviesTask = WhenGetMovies(client);
    var theatersTask = WhenGetTheaters(client);
    var movies = await moviesTask;
    var theaters = await theatersTask;
}
于 2013-06-27T13:57:27.327 に答える
0

上記の 2 つの変数 (private bool _moviesLoaded;private bool _theatersLoaded;) をプロパティとして作成し、完了した eventhandlers に設定します。セットが呼び出されるまでローダーを使用し、セットが呼び出されたらこのローダーを無効にすると、このデータを作業に使用できるようになります..

于 2013-06-27T13:56:27.290 に答える