C # перестает работать при выполнении асинхронного пост-запроса - PullRequest
0 голосов
/ 16 мая 2018

Я работаю над мобильным приложением, и проблема в том, что когда я выполняю асинхронный запрос (PostAsync) с помощью Net.Http, моя программа перестает работать.

Вот мой класс запросов, где я выполняю запросы, используя Net.Http.

...

namespace BSoft.Requests
{
   public class Requests
    {
      public Requests(){}

       public static string HostName =  "https://dev5.360businesssoft.com/";

    private static readonly HttpClient httpClient = new HttpClient();

    public static async Task<string> PerformPostRequest(Dictionary<string, string> values, string path)
    {
        string url = HostName + path;
        FormUrlEncodedContent content = new FormUrlEncodedContent(values);
        HttpResponseMessage response = await httpClient.PostAsync(url, content);
        string responseString = await response.Content.ReadAsStringAsync();
        return responseString;
    }

}
}

и вот мой класс входа в систему, где я вызываю вызов запроса и отображаю результат в виде строки.

... 

namespace BSoft.Login
{
public class Login
{
    public Login()
    {
    }      

    public static void PerformLogin(string username, string password, bool remember)
    {
        var values = new Dictionary<string, string>();
        values.Add("User", username);
        values.Add("Password", password);

        var ReturnedObj = Requests.Requests.PerformPostRequest(values, "test.php").Result;
        System.Diagnostics.Debug.WriteLine(ReturnedObj);
    }
}
}

Это скриншот приложения, вы можете заметить, что кнопка зависла

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Вызов Result блокирует поток графического интерфейса.Вместо этого await результат:

var ReturnedObj = await Requests.Requests.PerformPostRequest(values, "test.php");
System.Diagnostics.Debug.WriteLine(ReturnedObj);

Ваш вызов Result заблокирует поток графического интерфейса до завершения PerformPostRequest, так что здесь нет особого смысла использовать функции async.Если вы действительно не хотите, чтобы код выполнялся асинхронно, вы можете также удалить вызовы асинхронных методов и сделать вызовы синхронными.

0 голосов
/ 16 мая 2018

Попробуйте

string returnedString = await Requests.Requests.PerformPostRequest(values, "test.php");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...