HttpClient GetAsyn c зависает - PullRequest
0 голосов
/ 05 мая 2020

После авторизации загружается страница контактов. Метод вызывается на странице viewmodel.

public partial class Contacts : ContentPage
        {
            ContactsPageViewModels vm;    
            public Contacts()
            {
                vm = new ContactsPageViewModels();
                BindingContext = vm;
                InitializeComponent();
            }
         }

Я пробовал отправить всего 200ок. Все доходит до http анализатора, но в самом приложении висит на первой строчке

public async Task<ObservableCollection<UserModel>> GetContactsList()
        {
            //freezes in the first line
            var response = await client.GetAsync("http://localhost:52059/api/Home/GetContacts/" + Convert.ToString(App.User.ID));
            string responseBody = await response.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<ObservableCollection<UserModel>>(responseBody);
        }

Контроллер

        [HttpGet]
        [Route("GetContacts/{id}")]
        public ActionResult GetContacts(int id)
        {
            ObservableCollection<UserModel> users = new ObservableCollection<UserModel>();

            foreach (UserModel user in db.UserModels)
                users.Add(user); 

            users.Remove(db.UserModels.FirstOrDefault(u => u.ID == id));

            Response.Headers.Add("Content-Type", "application/json");

            //return Ok();
            return new JsonResult(users);
        }

В почтальоне все работает

1 Ответ

1 голос
/ 05 мая 2020

Похоже на проблему с контекстом синхронизации и нахождением в основном потоке приложения.

Подробнее здесь:

https://devblogs.microsoft.com/dotnet/configureawait-faq/

или здесь:

https://medium.com/bynder-tech/c-why-you-should-use-configureawait-false-in-your-library-code-d7837dce3d7f

и попробуйте:

public async Task<ObservableCollection<UserModel>> GetContactsList()
{
    //freezes in the first line
    var response = await client.GetAsync("http://localhost:52059/api/Home/GetContacts/" + Convert.ToString(App.User.ID)).ConfigureAwait(false);
    string responseBody = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
    return JsonConvert.DeserializeObject<ObservableCollection<UserModel>>(responseBody);
}

Что происходит, это тупик, потому что основной поток ожидает для завершения asyn c. И asyn c хочет вернуться к потоку и завершить asyn c - но не может, потому что основной поток его ждет.

.ConfigureAwait(false)

скажет (not копаясь в конечном автомате и как работает async / await), что он завершится в каком-то другом потоке, то есть вызывающем (основном / синхронизирующем) потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...