2

誰かが私がどこで間違っているのか教えてくれるのだろうか。wpfアプリケーションVS2012にサービス参照を追加しました

ただし、非同期呼び出しの待機がブロックされているため、現時点では何もしていません。サービスリファレンスを追加したときに無料で受けた非同期呼び出し...

しかし、私await ma.searchModelsAsyncがブロックされたとき...

誰かがこれに光を当てることができますか?

まず、次のような関数を呼び出します。

private async void Button_Click_1(object sender, RoutedEventArgs e)
{
    button1.IsEnabled = false;

    var cnt = await GetDataFromWcf();
    button1.IsEnabled = true;
}

これが私が呼び出す実際の関数です

public async Task<List<ViewModels.ModelInfo>> GetDataFromWcf()
{
    using (var ma = new DataGenic.ModelActionsServiceTypeClient())
    {
        var modelInfos = await ma.searchModelsAsync(new ModelSearchCriteria { Category = "ECB" }, 1, 50);
        return modelInfos.Select(mi => new ViewModels.ModelInfo { Id = mi.Id, Name = mi.Name, Uri = mi.Uri }).ToList();
    }
}

ところで:関数をaに入れると、Task.Run(() => ...期待どおりに動作します...

WCFが本当に私が欲しいものを私に与えているかどうかわからない..誰かアイデア?

4

1 に答える 1

3

これまでのコメントスレッドに基づくと、WCFタスクが開始する前に十分な作業が行われているため、GetDataFromWcfをそれよりも早く呼び出し元に返す必要があるようです。これは非同期メソッド(IMHO)でやや一般的な問題です-最初の「await」呼び出しまで同期的に実行される「gotcha」なので、最初の「await」の前に多くのことが起こった場合でも、顕著なUI遅延が発生する可能性があります:)

そのため、簡単な変更はTask.Yieldを使用することです(GetDataFromWcfawait Task.Yield(); の最初の行として追加することにより)。これにより、動作が変更され、非同期メソッドが呼び出し元にすぐに返されます。MSDNのドキュメントに記載されているように、await Task.Yield();を使用できます。非同期メソッドで、メソッドを強制的に非同期で完了させます。その文だけで(そしてそれが表面上どれほどばかげているように聞こえるか)、「落とし穴」を示すのに役立ちますIMHO :)

于 2012-09-20T15:34:47.893 に答える