我的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})方法更改为返回ProcessRepositoriesHttpResponseMessage
result
4)使用return await client.PostAsync("hello",content);如下所述,但这将在不同的上下文中返回结果,并且看到这种统一性,您可能希望在ui线程上得到结果,所以请注意。

08-26 23:18