c# - 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
我做错了什么?
解决方案
经过大量研究,我了解到这部分引起的错误
var httpWebRequest = (HttpWebRequest)WebRequest.Create(serverAddress.serverMainAddress + "RegisterApi/register");
看起来它是同步过程并冻结主线程。
解决这个问题,你可以按照这个
或使用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;
}
推荐阅读
- android - Android Studio 编译 Gradle 错误
- algorithm - 如何将值插入此二项式堆?
- python - 将 methodcaller 和 attrgetter 与 sorted 相结合
- python - 自动生成对 n 个元素进行排序的代码的方法
- javascript - 使用 JavaScript 获取基于 IP 的访问者国家
- html - HTML网站上的音频自动播放不起作用
- google-apps-script - 尝试在 Google 协作平台上创建 Google Sheet 搜索框
- python-3.x - Change the x_axis from numbers to months
- tensorflow - tf.contrib.data.shuffle_and_repeat 中断 tf.contrib.data.rejection_resample
- android - ColorStateList 序列化/反序列化是否可行