我的unity游戏中有一个非常基本的脚本,它试图将post中的表单数据提交给服务器。但团结似乎无限期地冻结/停滞。我很困惑为什么会这样,所以我不知道如何解决这个问题。
我在这篇文章后面做了一个松散的代码:
https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/console-webapiclient#making-web-requests
我的服务器确实收到了请求,并写了一个回。但因为统一被冻结了,所以目前还不能真正使用。
我的班级是这样的:
public class HTTPManager : MonoBehaviour
{
private static HttpClient client = new HttpClient();
private void Awake()
{
client.BaseAddress = new Uri("http://localhost:8080/");
ProcessRepositories().Wait();
}
private async Task ProcessRepositories()
{
client.DefaultRequestHeaders.Accept.Clear();
FormUrlEncodedContent content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("u", "test")
});
//this goes to http://localhost:8080/hello with POST u=test
HttpResponseMessage result = await client.PostAsync("hello",content);
Debug.Log("Is Success: "+result.IsSuccessStatusCode);
Debug.Log("Status code: "+result.StatusCode);
Debug.Log("Reason Phrase: "+result.ReasonPhrase);
Debug.Log("Headers: "+result.Headers);
Debug.Log("Content: "+result.Content);
Debug.Log("Request Message: "+result.RequestMessage);
Debug.Log("Version: "+result.Version);
}
}
是什么导致了绞刑的问题?是吗?
最佳答案
ProcessRepositories().Wait();
正在阻塞
async
代码,并导致死锁。斯蒂芬显然在this上有一系列的帖子。要么让所有代码一直向上,要么在您的
async
上安排继续。编辑:似乎
Task
是一种Awake
方法。为此,您有4个选项:1)从
Unity
中移除async Task
。删除方法体中的ProcessRepositories()
,并同步调用服务器。这会引起不安,这不是游戏环境中推荐的解决方案。2)从
await
中移除.Wait()
。这将导致您的代码异步发送到服务器,但您将无法对响应执行任何操作。如果你不在乎对方的反应,这就没问题了。3.)如果您确实关心响应,可以将
ProcessRepositories()
安排在Continuations
上。这是一种“回调”,当您的ProcessRepositories()
已Task
或出错时将运行。为此,将RanToCompletion
更改为ProcessRepositories()
并将ProcessRepositories().ContinueWith(task=>{// in here you can access task.Result to get your response})
方法更改为返回ProcessRepositories
HttpResponseMessage
即
result
4)使用
return await client.PostAsync("hello",content);
如下所述,但这将在不同的上下文中返回结果,并且看到这种统一性,您可能希望在ui线程上得到结果,所以请注意。