2

async/を使用してオブジェクトを返す関数を作成しましたawait。関数をジェネリックにして、渡したオブジェクトを返すことができるようにしたいと思います。返されるオブジェクトを除いて、コードはボイラープレートです。GetAsync を呼び出して、正しいオブジェクトを返せるようにしたい

public Patron getPatronById(string barcode)
{
    string uri = "patrons/find?barcode=" + barcode;
    Patron Patron =  GetAsync(uri).Result;
    return Patron;
}

private async Task<Patron> GetAsync(string uri)
{
    var client = GetHttpClient(uri);
    var content = await client.GetStringAsync(uri);
    JavaScriptSerializer ser = new JavaScriptSerializer();
    Patron Patron = ser.Deserialize<Patron>(content);
    return Patron;
}
4

2 に答える 2

5

ジェネリックメソッドはどうですか?

private async Task<T> GetAsync<T>(string uri)
{
    var client = GetHttpClient(uri);
    var content = await client.GetStringAsync(uri);
    var serializer = new JavaScriptSerializer();
    var t = serializer.Deserialize<T>(content);
    return t;
}

通常、このメソッドを別のクラスに配置してpublic、別のクラスのメソッドで使用できるようにする必要があります。

このメソッドを呼び出す方法に関しては、次のことを試すことができます。

 // I capitalized the first letter of the method, 
 // since this is a very common convention in .NET
 public Patron GetPatronById(string barcode)
 {
     string uri = "patrons/find?barcode=" + barcode;
     var Patron =  GetAsync<Patron>(uri).Result;
     return Patron;
 }

GetAsync: 上記のスニペットでは、を別のクラスに移動していないと想定しています。移動する場合は、少し変更する必要があります。

アップデート

私はあなたのメモの意味に従っていません。Yuvalが以下で行ったように、GetPatronByIdもタスク関数にする必要がありますか?

私は次のようなことを意味します:

// The name of the class may be not the most suitable in this case.
public class Repo
{
    public static async Task<T> GetAsync<T>(string uri)
    {
        var client = GetHttpClient(uri);
        var content = await client.GetStringAsync(uri);
        var serializer = new JavaScriptSerializer();
        var t = serializer.Deserialize<T>(content);
        return t;
    }
}

public Patron GetPatronById(string barcode)
{
     string uri = "patrons/find?barcode=" + barcode;
     var Patron =  Repo.GetAsync<Patron>(uri).Result;
     return Patron;
}
于 2016-08-30T19:32:59.290 に答える
2

ジェネリックは次の方法で簡単に実行できます。

private async Task<T> GetAsync(string uri)
{
    var client = GetHttpClient(uri);
    var content = await client.GetStringAsync(uri);
    return JsonConvert.DeserializeObject<T>(content);
}

注意事項:

  1. JavaScriptSerializer は古くから廃止されているため、使用しないでください。代わりにJson.NETを試してください。

  2. これ:

    Patron Patron =  GetAsync(uri).Result;
    

    危険であり、特に Web API で潜在的なデッドロックを引き起こす可能性があります。「ずっと非同期」にする必要があります。

    public Task<Patron> GetPatronByIdAsync(string barcode)
    {
       string uri = $"patrons/find?barcode={barcode}";
       return GetAsync<Patron>(uri);
    }
    

そして、最上位レベルの呼び出し元だけが必要awaitですTask。おそらくいくつかのコントローラーアクション:

public async Task SomeAction()
{
     await GetPatronByIdAsync("hello");
}
于 2016-08-30T19:34:31.723 に答える