4

MVC4 で Validation 属性を書き込もうとしています。目的は、アプリケーション参照 (重複を防止したいキーを表す単なる文字列) の存在を確認することです。私のデータは WebAPI 経由でアクセスされます。私は 4.5 を使用しているため、可能であればこれを非同期にしたいと考えています。

私はおそらく async と await を最適または適切に使用していませんが、継承された Validation クラスのオーバーライドされた IsValid メソッドから非同期メソッドを呼び出す方法を知りたいです。

public class UniqueApplicationReferenceAttribute : ValidationAttribute
{
    public UniqueApplicationReferenceAttribute() : base(() => "The {0} already exists") { }

    public int? ApplicationCount { get; set; }

    public override bool IsValid(object value)
    {
        var myTask = GetApplicationRefCountAsync();

        myTask.Wait();

        this.ApplicationCount = this.ApplicationCount ?? 0;

        if (ApplicationCount > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }


    public async Task GetApplicationRefCountAsync()
    {
        HttpClient client = new HttpClient();

        client.BaseAddress = new Uri("http://localhost:11111/");
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

        var apps = client.GetStringAsync("api/dataapplications");

        await Task.WhenAll(apps);

        var appList = apps.Result;

        this.ApplicationCount =  appList.Count();// apps.Count();
    }
}

どうもありがとう、ダン。

4

2 に答える 2

2

これを完全にテストすることはできませんが、次のようなことができるはずです。

public bool IsValid(object value)
{
    var appCount = GetApplicationRefCountAsync().Result;
    return appCount > 0;
}

public async Task<int> GetApplicationRefCountAsync()
{
    var client = new HttpClient();

    client.BaseAddress = new Uri("http://localhost:11111/");
    client.DefaultRequestHeaders.Accept.Add(
        new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

    return await client.GetStringAsync("api/dataapplications")
        .ContinueWith(r => Convert.ToInt32(r))
        .ConfigureAwait(false);
}

ASP.NET スレッドで async/await メソッドを使用する場合は注意してください。デッドロックを作成するのは簡単です。

于 2013-09-09T22:03:15.053 に答える