【问题标题】:client.GetAsync call hangs when calling the api from wpf从 wpf 调用 api 时,client.GetAsync 调用挂起
【发布时间】:2016-04-13 12:22:56
【问题描述】:

调用我在不同项目中运行的 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 或 else 没有被命中。

已阅读该方法调用将导致此堆栈出现死锁(挂起)帖子: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);

这给了我一个错误 --> 等待操作符只能在异步方法中使用。

【问题讨论】:

    标签: c# wpf http


    【解决方案1】:

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

    但在这种情况下,您正在通过调用阻塞用户界面线程:

    task.GetAwaiter().GetResult();
    

    因此 UI 线程被此阻塞,并且在 client.GetAsync 完成后 - 它无法返回 UI 线程 - 因此您陷入僵局。那就是简单的解释。

    要修复,不要阻塞 UI 线程(反正你不需要):

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

    【讨论】:

    • 试过这个,它告诉我await运算符只能在异步方法中使用,但有趣的是我的方法是异步方法?
    • 您需要将执行此操作的方法标记为异步。假设您在按钮单击处理程序中执行此操作,则只需执行“async void OnButtonClick(object sender, RoutedEventArgs e)”
    • 好的,我试一试!坚持住!
    • 感谢您的快速回复;)现在我终于收到了来自 api 的回复!你摇滚!
    猜你喜欢
    • 2022-11-24
    • 2019-05-12
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多