1

私は WCF サービスを使用して WPF アプリケーションにデータをロードしていますが、最近まで、Visual Studio が自動生成したイベント ベースの非同期メソッドを使用してロードしていました。

//Old way
private void LoadFoos(int barId)
{
    serviceClient.SelectFoosByBarIdCompleted += (s, e) =>
    {
        Foos = e.Result.OrderBy(f => f.Description).ToList();
    });
    serviceClient.SelectFoosByBarIdAsync();
}

なんらかの理由で、Tasks の使用に移行しましたが、同じようなことを行う最善の方法について質問がありました。

//New way
private async void LoadFoos(int barId)
{
    private TaskScheduler uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
    serviceClient.SelectFoosByBarIdAsync(barId).ContinueWith(t => 
    {
        Foos = t.Result.OrderBy(f => f.Description).ToList();
    }, uiTaskScheduler);
}

コンテキストを手動で設定する必要があるため、間違ったスレッドで更新しないようにする必要があるため、これは醜いと思います (Foosはデータ バインドされたプロパティです)。また、私はこれを行うことができると思いました:

//New way #2, doesn't sort ;(
private async void LoadFoos(int barId)
{
    private TaskScheduler uiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
    var selectFoosTask = serviceClient.SelectFoosByBarIdAsync(barId);
    Foos = selectFoosTask;
}

しかし、それでは注文できませんDescription

タスクの概念全体は私にとってかなり新しいものなので、何かが足りないかもしれません。私が上にリストしたものよりも簡潔な方法はありますか?

4

3 に答える 3

1

継続ではなく、単に await を使用します。

private async Task LoadFoos(int barId)
{
    var temp = await serviceClient.SelectFoosByBarIdAsync(barId);

    Foos = temp.OrderBy(f => f.Description).ToList();
}

async void を使用したり、Taskメソッドを返すだけであったりすることは、おそらく理想的ではないことに注意してください。これを次のように書き直す方がよいでしょう (* Foos が a であると仮定List<string>):

private async Task<List<string>> LoadFoosAsync(int barId)
{
    var temp = await serviceClient.SelectFoosByBarIdAsync(barId);
    return temp.OrderBy(f => f.Description).ToList();
}

次に、これを呼び出すときは、次を使用します。

Foos = await LoadFoosAsync(id);
于 2013-10-10T18:30:37.010 に答える
0

メソッドは、継続を手動で追加するのではなくasync単なるタスクであるため:await

private async Task LoadFoos(int barId)
{
    Foos = (await serviceClient.SelectFoosByBarIdAsync(barId))
        .OrderBy(f => f.Description).ToList();
}

async voidまた、非同期操作がいつ終了するかを知る方法や、スローされた例外にアクセスする方法がないため、可能な限りメソッドを避ける必要があることに注意してください。代わりに、メソッドが a を返すようにしTaskます。メソッドに他のフィールドを設定させるのではなく、これが返すデータがTask<T>どこにあるかをメソッドに返させる方が良いでしょう。T

于 2013-10-10T18:29:03.587 に答える