做的网站进不去后台,如何做滴滴网站平台,品牌建设 企业发言,十大营销咨询公司我理解的invoke和begininvoke 一直对invoke和begininvoke的使用和概念比较混乱#xff0c;这两天看了些资料#xff0c;对这两个的用法和原理有了些新的认识和理解。 首先说下#xff0c;invoke和begininvoke的使用有两种情况#xff1a; 1. control中的invoke、begininvok… 我理解的invoke和begininvoke 一直对invoke和begininvoke的使用和概念比较混乱这两天看了些资料对这两个的用法和原理有了些新的认识和理解。 首先说下invoke和begininvoke的使用有两种情况 1. control中的invoke、begininvoke。 2. delegrate中的invoke、begininvoke。 这两种情况是不同的我们这里要讲的是第1种。下面我们在来说下.NET中对invoke和begininvoke的官方定义。 control.invoke(参数delegate)方法:在拥有此控件的基础窗口句柄的线程上执行指定的委托。 control.begininvoke(参数delegate)方法:在创建控件的基础句柄所在线程上异步执行指定委托。 根据这两个概念我们大致理解invoke表是同步、begininvoke表示异步。但是如何来进行同步和异步呢我们来做一个测试。 invoke 例子 private void button1_Click(object sender, EventArgs e){ MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()AAA); invokeThread new Thread(new ThreadStart(StartMethod)); invokeThread.Start(); string a string.Empty; for (int i 0; i 3; i) //调整循环次数看的会更清楚 { Thread.Sleep(1000); a a B; } MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()a);} private void StartMethod(){ MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()CCC); button1.Invoke(new invokeDelegate(invokeMethod)); MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()DDD);} private void invokeMethod(){ //Thread.Sleep(3000); MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() EEE);} 结论我们运行后看下程序的运行顺序1AAA-3CCC和1BBB-1EEE -3DDD 。 解释主线程运行1AAA然后1BBB和子线程3CCC同时执行然后通过invoke来将invokemethod方法提交给主线程然后子线程等待主线程执行直到主线程将invokemethod方法执行完成期间必须等待主线程的任务执行完成才会去执行invoke提交的任务最后执行子线程3DDD。 begininvoke 例子 private void button1_Click(object sender, EventArgs e){ MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()AAA); invokeThread new Thread(new ThreadStart(StartMethod)); invokeThread.Start(); string a string.Empty; for (int i 0; i 3; i) //调整循环次数看的会更清楚 { Thread.Sleep(1000); a a B; } MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()a);} private void StartMethod(){ MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()CCC); button1.BeginInvoke(new invokeDelegate(invokeMethod)); MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString()DDD);} private void beginInvokeMethod() { //Thread.Sleep(3000); MessageBox.Show(Thread.CurrentThread.GetHashCode().ToString() EEEEEEEEEEEE); } 结论 我们运行后看看执行的结果1AAA-1BBB和3CCC-1EEE和3DDD。 解释 主线程运行1AAA然后1BBB和子线程3CCC同时执行然后通过begininvoke来将invokemethod方法提交给主线程然后主线程执行1EEE主线程自己的任务执行完成 同时子线程继续执行3DDD。 通过这个两段代码的测试比较我们会发现其实invoke和begininvoke所提交的委托方法都是在主线程中执行的其实根据我invoke和begininvoke的定义我们要在子线程中来看这个问题在invoke例子中我们会发现invoke所提交的委托方法执行完成后才能继续执行DDD在begininvoke例子中我们会发现begininvoke所提交的委托方法后子线程讲继续执行DDD不需要等待委托方法的完成。 那么现在我们在回想下invoke同步和begininvoke异步的概念其实它们所说的意思是相对于子线程而言的其实对于控件的调用总是由主线程来执行的。我们很多人搞不清这个同步和异步主要还是因为我们把参照物选错了。其实有时候光看概念是很容易理解错误的。 posted on 2011-11-03 11:57 zhao.zk 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/Z-King/archive/2011/11/03/2234337.html