应用场景:
在做winform的时候,如果进行一个较长时间的运算,界面就会呈现死机的状态,所以一般用子线程来做计算;同时又要在主界面上显示出来进度。
传统方法:
public partial class Form1 : Form
{
private delegate void RefreshStateDelegate(object param);
private RefreshStateDelegate _dlg;
public Form1()
{
InitializeComponent();
_dlg = new RefreshStateDelegate(RefreshState);
}
private void RefreshState(object state)
{
label1.Text = state.ToString();
}
private void SomeWork()
{
for (int i = 0; i < 100; i++)
{
label1.BeginInvoke(_dlg, i);
Thread.Sleep(50);
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(SomeWork);
thread.Start();
}
使用匿名委托方法:
private void button3_Click(object sender, EventArgs e)
{
RefreshStateDelegate dlg = delegate (object param)
{
label1.Text = param.ToString();
};
Thread thread = new Thread((object x) =>
{
for (int i = 0; i < 100; i++)
{
label1.BeginInvoke(_dlg, x+":"+i);
Thread.Sleep(50);
}
});
thread.Start("匿名");
}
使用async方法:
private async void SomeWork2()
{
await Task.Run(() =>
{
for(int i=0;i<100;i++)
{
label1.Text = i.ToString();
label1.BeginInvoke(_dlg, i);
Thread.Sleep(50);
}
});
}
用匿名委托方法要简洁一点,但传统方法最好理解,而且声明一个_dlg也可以在多个地方被复用。只要将回传的参数里设置一个回调类型,然后在回调函数里根据类型做不同的处理即可。async还没有体会到有什么特别的好处。