6

次のスニペットが非同期データ ソースに正しくバインドされているかどうかわかりますか?

動作しているように見えますが、つまり、UI がフリーズしません。MSDN のドキュメントでは、これらのドキュメントの「非同期」メソッドへのバインドについて実際には言及されていないため、正確性については完全にはわかりません。

Binding.IsAsync

ObjectDataProvider.IsAsynchronous

<pages:HottestPageProxy x:Key="PageProxy" ></pages:HottestPageProxy>

<ObjectDataProvider x:Key="DataProviderArtists" IsAsynchronous="True"  ObjectInstance="{StaticResource PageProxy}"  MethodName="GetArtists">
    <ObjectDataProvider.MethodParameters>
        <system:String>Grabbing artists !</system:String>
    </ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

(HottestPageProxy オブジェクトは、コントロールにデータを提供する小さなヘルパーです)

public class HottestPageProxy
{
    [UsedImplicitly]
    public async Task<ArtistsQuery> GetArtists([CallerMemberName] string memberName = "")
    {
        Console.WriteLine(memberName);
        string apiKey = App.GetApiKey();
        Task<ArtistsQuery> topHottt = Queries.ArtistTopHottt(new ArtistTopHotttParameters
        {
            ApiKey = apiKey,
            Results = 100,
            Buckets = new[] {ArtistTopHotttBuckets.Hotttnesss}
        });
        return (await topHottt);
    }
}

EDIT : 「topHottt を待機」するメソッドの呼び出し

public static async Task<ArtistsQuery> ArtistTopHottt(ArtistTopHotttParameters parameters)
{
    if (parameters == null) throw new ArgumentNullException("parameters");
    return await Get<ArtistsQuery>(parameters);
}

private static async Task<T> Get<T>(Parameters parameters) where T : Query
{
    if (parameters == null) throw new ArgumentNullException("parameters");
    ValidateParameters(parameters);

    string url = parameters.GetQueryUrl();
    var value = new Uri(url);
    using (var client = GetHttpClient())
    using (var message = await client.GetAsync(url))
    {
        // fetch message content (removed)
        return GetQueryResultObject<T>(s);
    }
}

private static T GetQueryResultObject<T>(string json) where T : class
{
    // create T from Json string (removed)
    return t;
}

AsyncExを使用して編集

構文は次のようになりますが、ライブラリの使用は機能します。

<ItemsControl x:Name="ItemsControlTopHott"
    ItemsSource="{Binding ... Path=Artists.Result.Artists ...}">
</ItemsControl>

'Artists.Result.Artists' は本当に私が使用するものですか? :)

新しい構文は、ソースが次のように混乱を招きます。

public sealed class ArtistsQuery : Query
{
    public List<Artist> Artists { get; set; }
}

大したことではありませんが、そのような構文を回避できれば、それは素晴らしいことです。

あなたは .Result がデッドロックをもたらすかもしれないと言いましたが、私はあなたのソリューションを実装する際に何かを見逃していましたか?

Artists.PropertyChanged イベントにより、次のメッセージが発生しました。

  • ステータス: RanToCompletion
  • IsCompleted: 真
  • IsSuccessfullyCompleted: 真
  • 結果: 成功

投稿で言及したように、 .ConfigureAwait(false) を試して、それがどのように機能するかを確認します。

言及するのを忘れましたが、実際に .Result を使用した私の実装は、結果を取得するための通常の時間は数秒であるため、実際に UI をブロックしません。UIがフリーズするのを見たでしょう。それは正しいように思えます...しかし、それが正しいかどうかはわかりません。したがって、私の質問です。

4

1 に答える 1