日期:2014-05-20  浏览次数:20907 次

多线程中访问主线程控件
form   中,创建一个线程以编程方式创建控件,实例化控件,然后将所创建的控件附到主线程中的panel中,如何实现哦?

------解决方案--------------------
simple exmple..

private void button2_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(ThreadProc));
thread.Start();
}
private void ThreadProc()
{
MethodInvoker mi = new MethodInvoker(AddControls);
this.BeginInvoke(mi);
}
private void AddControls()
{
TextBox tb = new TextBox();
tb.Name = "test ";
this.panel1.Controls.Add(tb);
}
------解决方案--------------------
异步委托提供以异步方式调用同步方法的能力。当同步调用一个委托时,“Invoke”方法直接对当前线程调用目标方法。如果编译器支持异步委托,则它将生成“Invoke”方法以及“BeginInvoke”和“EndInvoke”方法。如果调用“BeginInvoke”方法,则公共语言运行库 (CLR) 将对请求进行排队并立即返回到调用方。将对来自线程池的线程调用该目标方法。提交请求的原始线程自由地继续与目标方法并行执行,该目标方法是对线程池线程运行的。如果在对“BeginInvoke”方法的调用中指定了回调方法,则当目标方法返回时将调用该回调方法。在回调方法中,“EndInvoke”方法获取返回值和所有输入/输出参数。如果在调用“BeginInvoke”时未指定任何回调方法,则可以从调用“BeginInvoke”的线程中调用“EndInvoke”。
------解决方案--------------------
private void button1_Click(object sender, System.EventArgs e)
{
this.listView1.SmallImageList = this.imageList1;
Thread t = new Thread(new ThreadStart(Add));
t.Start();
}

private void Add()
{
string path = @ "C:\风景\1600_1200 ";

DirectoryInfo dir = new DirectoryInfo(path);
FileInfo[] fiArr = dir.GetFiles( "*.* ");
foreach (FileInfo f in fiArr)
{
string fileName = f.FullName;
aHandler a = new aHandler(addItem);
this.Invoke(a,new object[] {fileName});
}

}


private void addItem(string fileName)
{
Image img = GetImage(fileName);
imageList1.Images.Add(img);
ListViewItem item = new ListViewItem();
item.Text = fileName;
item.ImageIndex = imageList1.Images.Count-1;
listView1.Items.Add(item);
Application.DoEvents();
}

private Image GetImage(string fileName)
{
Image img = System.Drawing.Image.FromFile(fileName);

return img;
}