委托的几种用法

来源:互联网 发布:淘宝龙泉宝剑 编辑:程序博客网 时间:2024/05/18 02:56


应用场景:

在做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还没有体会到有什么特别的好处。



原创粉丝点击