从wpf调用api时,client.GetAsync调用挂起

时间:2016-04-13 12:22:57

标签: c# wpf http

调用api应用程序时遇到问题我正在另一个项目中运行。当我调试时,我可以看到呼叫在api中击中了正确的控制器。点击“继续”后,它就会挂起,没有任何反应。

我调用Api的方法

public async Task<ObservableCollection<Room>> SearchForAvailableRooms(DateTime from, DateTime to, bool smoke, bool minibar, int rooms, int customers)
{
    ObservableCollection<Room> data = new ObservableCollection<Room>();

    // Call api to get rooms
    var client = new HttpClient();
    client.BaseAddress = new Uri("http://localhost:15998/");
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    // New code:
    HttpResponseMessage response = await client.GetAsync("api/room");
    if (response.IsSuccessStatusCode)
    {
        var jsonAsString = await response.Content.ReadAsStringAsync();
    }
    else
    {
        throw new ApplicationException(string.Format("Response message is not OK. Issues in action: {0}", "api/room"));
    }

    return null;
}

client.GetAsync(“api / room”)调用了api,但是在它没有得到任何进一步之后.. if或者其他没有被命中。

已经读过方法调用会导致此帖子发布死锁(挂起):Link to the post

他解释说,在我调用方法的地方有事可做。 现在我正在使用这些行来调用方法:

var task = _getRoomsService.SearchForAvailableRooms(searchModel.From, searchModel.To, searchModel.Smoke, searchModel.Minibar, searchModel.RoomValue, searchModel.CustomerValue);
var result = task.GetAwaiter().GetResult();
RoomsList = result;

可以看到这里有什么问题吗?

更新

我也尝试过:

RoomsList = await _getRoomsService.SearchForAvailableRooms(searchModel.From, searchModel.To, searchModel.Smoke, searchModel.Minibar, searchModel.RoomValue, searchModel.CustomerValue);

这给了我一个错误 - &gt; Await运算符只能在异步方法中使用。

1 个答案:

答案 0 :(得分:2)

你最有可能在UI线程上调用它。当您的方法调用sysdate时,会记住上下文,以便异步调用之后的部分可以在与之前的部分相同的上下文中执行。这样做是为了您的方便 - 从client.GetAsync返回后,您回到了UI线程,可以安全地使用用户界面控件。

但是在这种情况下,您通过调用:

来阻止用户界面线程
client.GetAsync

因此UI线程被阻止,并且在task.GetAwaiter().GetResult(); 完成后 - 它无法返回到UI线程 - 因此您将陷入僵局。如果用简单的术语解释的话。

要修复,只是不要阻止UI线程(你不需要):

client.GetAsync