初始
public partial class AsyncForm : Form
{
Label label;
Button button;
public AsyncForm()
{
label = new Label
{
Location = new Point(10, 20),
Text = "Length"
};
button = new Button
{
Location = new Point(10, 50),
Text = "Click"
};
//包装事件处理程序
button.Click += DisplayWebSiteLength;
AutoSize = true;
Controls.Add(label);
Controls.Add(button);
}
async void DisplayWebSiteLength(object sender, EventArgs e)
{
label.Text = "Fetching...";
using (HttpClient client = new HttpClient())
{
//开始获取页面
string text = await client.GetStringAsync("http://csharpindepth.com");
//更新页面
label.Text = text.Length.ToString();
}
}
}
以上绑定了 一个异步事件
开发Windows Form时,两条金科玉律
1、不要在UI线程上执行任何耗时的操作
2、不要在除了UI线程之外的其他线程上访问UI控件
插播一下Task任务
传送门
1、Task用的是线程池,线程池的线程数量的有上限的,这个可以通过ThreadPool修改
int minWorkThreadCount = processorCount * 4;
int minIOWorkThreadCount = processorCount * 2;
ThreadPool.SetMinThreads(minWorkThreadCount, minIOWorkThreadCount);
2、Task.Factory.StartNew不是直接创建线程,创建的是任务,它有一个任务队列,然后通过任务调度器把任务分配到线程池中的空闲线程中,如果任务的数量比线程池中的线程多,线程池的线程数量还没有到达上限,就会创建新线程执行任务。如果线程池的线程已到达上限,没有分配到线程的任务需要等待有线程空闲的时候才执行。
事实上async/await的循环链都可以止步于一个没有返回值的async函数。