Asynchronous 在加载窗体之前等待异步函数(Http请求)

Asynchronous 在加载窗体之前等待异步函数(Http请求),asynchronous,async-await,dotnet-httpclient,Asynchronous,Async Await,Dotnet Httpclient,我正在编写一个winform应用程序,希望在加载主窗体之前发送一个Http Post请求并获得响应。到目前为止,我的情况如下: 如果我这样做,表单加载将发送请求,表单将立即加载。请求-响应将在稍后到达,但在此期间,可以单击表单中的任何按钮(不是理想的) 所以我把代码改成了这个,我想表单会在请求-响应到达后加载。然而,与此相反,发生的情况是:表单在响应到达之前出现,但鼠标显示加载旋转形状,因此表单中的任何按钮都不可用。一旦响应到达,表单中的按钮就可用 这是正确的,但看起来不太好 private a

我正在编写一个winform应用程序,希望在加载主窗体之前发送一个Http Post请求并获得响应。到目前为止,我的情况如下:

如果我这样做,表单加载将发送请求,表单将立即加载。请求-响应将在稍后到达,但在此期间,可以单击表单中的任何按钮(不是理想的)

所以我把代码改成了这个,我想表单会在请求-响应到达后加载。然而,与此相反,发生的情况是:表单在响应到达之前出现,但鼠标显示加载旋转形状,因此表单中的任何按钮都不可用。一旦响应到达,表单中的按钮就可用

这是正确的,但看起来不太好

private async void Form1_Load(object sender, EventArgs e)
{
    //client is a HttpClient
    //byteContent is a ByteArrayContent
    var PostTask = client.PostAsync("theUrl", byteContent);
    PostTask.Wait(); //blocking here

    using (HttpResponseMessage response = PostTask.Result)
    {
        response.EnsureSuccessStatusCode();
       Trace.WriteLine(response.ToString());
    }

}
做我想做的事情的正确方法是什么:


只有在响应成功到达后,表单才会显示?

您还没有说明是否需要;重新使用WinForms或WPF

如果是WinForms,那么一种可能是引入“加载”表单。它将只包含以下内容:

"Please wait..." 
或者别的什么。调用完成后,您可以强制导航到主窗体。这样做的另一个好处是,您可以选择处理通话未完成的情况

如果您正在使用WPF,则可以将控件的可见性绑定到
已完成
已加载
标志(与
加载的可见性相反-请稍候…
进度指示器)。您还应该能够在视图模型内处理此问题;这意味着您不需要在表单事件中包含代码


我也会避免使用
.Wait()
来等待您的任务。更好的方法可能是使用类似的。

为什么在
async
方法中调用
Wait()
Result
? 您是否看到任何编译器警告

试试这个:

private async void Form1_Load(object sender, EventArgs e)
{
    try
    {
        this.Enable = false;

        //client is a HttpClient
        //byteContent is a ByteArrayContent

        using (var response = await client.PostAsync("theUrl", byteContent))
        {
            response.EnsureSuccessStatusCode();
            Trace.WriteLine(response.ToString());
        }
    }
    finally
    {
        this.Enable = true;
    }
}

谢谢我正在使用winform(现在编辑问题)。但是关于WPF的信息是非常感谢的,也谢谢你关于等待的建议。我会看一看,然后回到It实际上根本没有编译器警告。顺便问一下,这不是我发布并尝试过的代码吗?我调用Wait是因为我希望在响应到来后加载表单。使用上面的代码,表单将在不等待响应的情况下加载。是否完全没有编译器警告?没有CS1998?如果需要太长时间会发生什么?虽然我还没有考虑暂停,但是程序的规范说明如果第一次操作没有完成,就不能进行其他操作。
private async void Form1_Load(object sender, EventArgs e)
{
    try
    {
        this.Enable = false;

        //client is a HttpClient
        //byteContent is a ByteArrayContent

        using (var response = await client.PostAsync("theUrl", byteContent))
        {
            response.EnsureSuccessStatusCode();
            Trace.WriteLine(response.ToString());
        }
    }
    finally
    {
        this.Enable = true;
    }
}