天下

记录修行的印记

C# invoke,BeginInvoke,EndInvoke

 

C# invoke,BeginInvoke,EndInvoke
在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法是错误的做法,Invoke 和 BeginInvoke 就是为了解决这个问题而出现的,使你在多线程中安全的更新界面显示。
正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。
再举个简单例子说明下使用方法,比如你在启动一个线程,在线程的方法中想更新窗体中的一个TextBox.. 

using System.Threading;
//启动一个线程 
Thread thread=new Thread(new ThreadStart(DoWork)); 
thread.Start(); 
//线程方法 
private void DoWork() 

    
this.TextBox1.Text="我是一个文本框"

如果你像上面操作,在VS2005或2008里是会有异常的 


正确的做法是用Invoke\BeginInvoke
using System.Threading;
namespace test
{
    
public partial class Form1 : Form
    {
        
public delegate void MyInvoke(string str1,string str2);
        
public Form1()
        {
            InitializeComponent();
        }
        
public void DoWork()
        {
            MyInvoke mi 
= new MyInvoke(UpdateForm);
            
this.BeginInvoke(mi, new Object[] {"我是文本框","haha"});
        }
        
public void UpdateForm(string param1,string parm2)
        {
            
this.textBox1.Text = param1+parm2;
        }
        
private void button1_Click(object sender, EventArgs e)
        {
            Thread thread 
= new Thread(new ThreadStart(DoWork));
            thread.Start();
        }
    }
}


相关资料:Invoke 和 BeginInvoke 的真正涵义 、在多线程中如何调用Winform
Control.BeginInvoke 方法  Visual Studio 2010Visual Studio 
2010 
在创建控件的基础句柄所在线程上异步执行委托。
公共方法 BeginInvoke(Delegate) 在创建控件的基础句柄所在线程上异步执行指定委托。 
公共方法 BeginInvoke(Delegate,Object[])  在创建控件的基础句柄所在线程上,用指定的参数异步执行指定委托。 
public Object EndInvoke(IAsyncResult asyncResult)
参数:asyncResult 类型:System.IAsyncResult 
IAsyncResult,表示特定的调用异步操作,在调用 BeginInvoke 时返回。 

 

posted on 2016-09-08 10:16 天下 阅读(1014) 评论(0)  编辑 收藏 引用 所属分类: C#


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2013年3月>
242526272812
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿(4)

随笔分类(378)

随笔档案(329)

链接

最新随笔

搜索

最新评论