客户从wpf调用api时,GetAsync调用挂起



我在调用另一个项目中运行的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;
}

客户。GetAsync("api/room")对api进行调用,但在调用之后就再也没有了。。if或else没有被击中。

已经读到方法调用将导致死锁(挂起)从这个堆栈post:链接到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);

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

您很可能在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);

最新更新