特殊过程中的锁定控制
Locked Controls during Special Process
我写了一个函数,可以从网上下载图片之类的东西,然后使用它
在特殊按钮的点击事件中。
我的问题是当我点击按钮时,应用程序开始从
互联网,我所有的表格控件,锁定(直到下载过程完成!)
不仅控制,我所有的表格也是如此。
那么我如何在应用程序后台处理这个过程以及
用户可以同时使用其他控件。
你只需要异步编程
这是一个非常简单的演示
private async void button1_Click(object sender, EventArgs e)
{
this.Text = "doing something...";
var result = await SomeHeavyWork();
this.Text = result.ToString();
}
private async Task<int> SomeHeavyWork()
{
using (var hc = new HttpClient())
{
var data = await hc.GetAsync("www.google.com");
return data.Content.Headers.Count();
}
}
这里发生了什么?
- 点击
button1
时,button1_Click
会执行。
- 它首先将表单文本设置为"doing something..."
- 它现在等待
SomeHeavyWork()
完成它的工作。
- 我们现在正在退出
button1_Click
函数并执行我们在单击 button1
之前所做的操作(运行 表单消息循环)。但在其他地方我们执行 SomeHeavyWork()
并等待它。
- 当
SomeHeavyWork()
作业完成后,我们回到 button1_Click
并执行 this.Text = result.ToString();
行。
请阅读这篇文章msdn article
我写了一个函数,可以从网上下载图片之类的东西,然后使用它 在特殊按钮的点击事件中。 我的问题是当我点击按钮时,应用程序开始从 互联网,我所有的表格控件,锁定(直到下载过程完成!) 不仅控制,我所有的表格也是如此。 那么我如何在应用程序后台处理这个过程以及 用户可以同时使用其他控件。
你只需要异步编程
这是一个非常简单的演示
private async void button1_Click(object sender, EventArgs e)
{
this.Text = "doing something...";
var result = await SomeHeavyWork();
this.Text = result.ToString();
}
private async Task<int> SomeHeavyWork()
{
using (var hc = new HttpClient())
{
var data = await hc.GetAsync("www.google.com");
return data.Content.Headers.Count();
}
}
这里发生了什么?
- 点击
button1
时,button1_Click
会执行。 - 它首先将表单文本设置为"doing something..."
- 它现在等待
SomeHeavyWork()
完成它的工作。 - 我们现在正在退出
button1_Click
函数并执行我们在单击button1
之前所做的操作(运行 表单消息循环)。但在其他地方我们执行SomeHeavyWork()
并等待它。 - 当
SomeHeavyWork()
作业完成后,我们回到button1_Click
并执行this.Text = result.ToString();
行。
请阅读这篇文章msdn article