首页 > 解决方案 > Unity/c#async函数中的await freeze sync进程(应该在await之前执行)

问题描述

我有等待的异步功能async Task<string>,但在此之前它应该执行同步过程(即debug.log)。然而,相反,主线程冻结,直到等待返回一些东西。

调用该异步函数的按钮函数

 private void Register()
    {
        LogRegHandler.logRegHandler.RegisterProcess(RegisterNamefield.text, RegisterEmailfield.text, RegisterPassfield.text)
;    

}

冻结主线程的异步函数

public async void RegisterProcess(string name,string email, string password)
    {
        Debug.Log("before Await");
        RegLogUIController.regLogUIController.CreateLoadingPanel("dil controller editleyecek");
        string registerResult = await registerLogIn.RegisterUser(name,email, password);
        Debug.Log("after Await");
}

等待过程

 public async Task<string> RegisterUser(string name, string email, string password)
    {
        string jsonResponse;
        try
        {
            var httpWebRequest = (HttpWebRequest)WebRequest.Create(serverAddress.serverMainAddress + "RegisterApi/register");
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";
        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {

            string json = String.Format("{{\"name\":\"{0}\",\"email\":\"{1}\",\"password\":\"{2}\"}}",name,email,password);
            streamWriter.Write(json);
        }

        
            HttpWebResponse response = (HttpWebResponse)(await httpWebRequest.GetResponseAsync());
            StreamReader reader = new StreamReader(response.GetResponseStream());
            jsonResponse = reader.ReadToEnd();
        }
        catch (Exception)
        {
            return "";
        }
        return jsonResponse;

    }

日志

before Await
after Await
//they pop-up at the same time after freezing ends

我做错了什么?

标签: c#unity3dasynchronousasync-await

解决方案


经过大量研究,我了解到这部分引起的错误

  var httpWebRequest = (HttpWebRequest)WebRequest.Create(serverAddress.serverMainAddress + "RegisterApi/register");

看起来它是同步过程并冻结主线程。

解决这个问题,你可以按照这个

如何异步使用 HttpWebRequest (.NET)?

或使用httpClient代替HttpWebRequest

我在这里作为参考

https://blog.jayway.com/2012/03/13/httpclient-makes-get-and-post-very-simple/

所以只有等待的过程改变了

新的等待进程

    public async Task<string> RegisterUser(string name, string email, string password)
    {

        string jsonResponse;
        string json = String.Format("{{\"name\":\"{0}\",\"email\":\"{1}\",\"password\":\"{2}\"}}", name, email, password);
        try
        {
            using (var client = new HttpClient())
            {
                HttpResponseMessage response = await client.PostAsync(serverAddress.serverMainAddress + "RegisterApi/register", new StringContent(json, Encoding.UTF8, "application/json"));
                response.EnsureSuccessStatusCode();
                jsonResponse = await response.Content.ReadAsStringAsync();

            }
               
            

        }
        catch (Exception)
        {
            return "";
        }
        return jsonResponse;

    }

推荐阅读