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