“.Result”似乎没有同步行动

时间:2017-01-30 15:34:32

标签: post asynchronous c#-4.0 async-await

我有一个API调用,它使用SelectCommand同步操作。

protected void filterbutton_Click(object sender, EventArgs e)
{   
        string stroStatus = "";
        string stroDelivery_Status = "";
        SqlDataSource1.SelectParameters["oStatus"].DefaultValue = stroStatus;
        Parameter pm = SqlDataSource1.SelectParameters["oDelivery_Status"];


        if (!SqlDataSource1.SelectParameters.Contains(pm))
        {
           SqlDataSource1.SelectParameters.Add("oDelivery_Status",   
           stroDelivery_Status);
        }
       SqlDataSource1.SelectCommand = "SELECT * FROM [Orders] WHERE ([oStatus] = @oStatus) AND ([oDelivery_Status] = @oDelivery_Status)"
}

要查看API是否已成功完成,请在继续之前使用以下.Result语句。

HttpResponseMessage response = client.PostAsync("api/updatelastname", new StringContent(string.Format("UserId={0}&LastName={1}", userId, lastName),  Encoding.UTF8, "application/x-www-form-urlencoded")).Result;

我感到困惑的是,有时api调用完成没有问题,然后有时它没有。似乎有时代码不会等待API调用完成,因此if..thenif (!response.IsSuccessStatusCode) { // Something went wrong }

理想情况下,我认为最好在API调用中创建方法response.IsSuccessStatusCode并使用false关键字,但Web应用目前仅针对.NET 4并{{1}在.NET v4.5之前不支持async

在检查await之前,有关如何确保API调用完成的任何想法?没有转向.NET v4.5 +?

1 个答案:

答案 0 :(得分:1)

  

此时,网络应用仅针对.NET 4,直到.NET v4.5才支持异步和等待。

需要支持PostAsync的是客户端(呼叫await的人),而不是网络应用。我假设你的意思是客户 是一个网络应用程序。

  

有时api调用完成没有问题,然后有时它没有。

有时它没有完成,你的意思是?如同,代码永远不会从Result

返回

在某些情况下Result将会死锁,但我很惊讶在ASP.NET上找到一个(据我所知,Result所有HttpClient死锁仅在一些移动平台。)

  

似乎有时代码不会等待API调用完成,因此response.IsSuccessStatusCode为false。

你怀疑的是不可能的。 Result将阻止,直到HTTP请求完成。如果IsSuccessStatusCode返回false,那就是因为API返回了一个不成功的状态代码。