public delegate void InvokeDelegate(); //创建一个委托
private void button6_Click(object sender, EventArgs e)
{
Thread thread = new Thread(InvokeMethod);
thread.Start();
thread.Join();
listBox2.Items.AddRange(listBox1.Items); //为什么不执行
//textBox2.Text = "kjfsdfjk"; //换成这个,就要执行
}
public void InvokeMethod()
{
if (this.InvokeRequired)
{
this.BeginInvoke(new InvokeDelegate(AddItem));
}
}
private void AddItem()
{
listBox1.Items.Add("万万2邻期和尾");
listBox1.Items.Add("万万3邻期和尾");
listBox1.Items.Add("千千2邻期和尾");
listBox1.Items.Add("千千3邻期和尾");
listBox1.Items.Add("百百2邻期和尾");
listBox1.Items.Add("百百3邻期和尾");
}
在上面的代码中,我用Join方法使主线程阻塞,直到listBox1添加完项之后,才往下执行。可是为什么listBox2没有添加项呢?也就是说listBox2.Items.AddRange(listBox1.Items);这句为什么没有执行呢?
如果是把listBox2.Items.AddRange(listBox1.Items);换成textBox2.Text = "kjfsdfjk";却是执行了的请指教.....
private void button6_Click(object sender, EventArgs e)
{
Thread thread = new Thread(InvokeMethod);
thread.Start();
thread.Join();
listBox2.Items.AddRange(listBox1.Items); //为什么不执行
//textBox2.Text = "kjfsdfjk"; //换成这个,就要执行
}
public void InvokeMethod()
{
if (this.InvokeRequired)
{
this.BeginInvoke(new InvokeDelegate(AddItem));
}
}
private void AddItem()
{
listBox1.Items.Add("万万2邻期和尾");
listBox1.Items.Add("万万3邻期和尾");
listBox1.Items.Add("千千2邻期和尾");
listBox1.Items.Add("千千3邻期和尾");
listBox1.Items.Add("百百2邻期和尾");
listBox1.Items.Add("百百3邻期和尾");
}
在上面的代码中,我用Join方法使主线程阻塞,直到listBox1添加完项之后,才往下执行。可是为什么listBox2没有添加项呢?也就是说listBox2.Items.AddRange(listBox1.Items);这句为什么没有执行呢?
如果是把listBox2.Items.AddRange(listBox1.Items);换成textBox2.Text = "kjfsdfjk";却是执行了的请指教.....
是C# winform?
在UI线程之外的线程访问控件解决办法
C#:
声明这句 Form.CheckForIllegalCrossThreadCalls = false; windows phone:把访问页面的代码放在 Dispatcher.BeginInvoke(() => 里面
例如:
private void RequestStreamCallBack(IAsyncResult ar)
{
Dispatcher.BeginInvoke(() =>
{
//
});
}
this.Invoke(new InvokeDelegate(AddItem));
就可以看到正常的效果了。
当你使用BeginInvoke的话,你的辅助线程将直接结束,你调用thread.Join(); 将变得毫无意义。只有通过Invoke回调的时候,才会等待回调函数执行完毕后才结束线程。
两个成对使用,优良的代码是有前必有后,或者直接用Invoke
this.Invoke(new InvokeDelegate(AddItem));
就可以看到正常的效果了。这个是正确的,子线程需要先得到资源才能操作界面上的控件
private void button6_Click(object sender, EventArgs e)
{
Thread thread = new Thread(InvokeMethod);
thread.Start();
}
public void InvokeMethod()
{
if (this.InvokeRequired)
{
this.BeginInvoke((MethodInvoker)AddItem);
}
}
private void AddItem()
{
listBox1.Items.Add("万万2邻期和尾");
listBox1.Items.Add("万万3邻期和尾");
listBox1.Items.Add("千千2邻期和尾");
listBox1.Items.Add("千千3邻期和尾");
listBox1.Items.Add("百百2邻期和尾");
listBox1.Items.Add("百百3邻期和尾"); for (int i = 0; i < listBox1.Items.Count; i++)
{ listBox2.Items.Add(listBox1.Items[i]);
}
}
{
listBox1.BeginUpdate();
...
listBox1.EndUpdate();
}
private void button6_Click(object sender, EventArgs e)
{
Thread thread = new Thread(InvokeMethod);
thread.Start();
}
public void InvokeMethod()
{
if (this.InvokeRequired)
{
this.BeginInvoke((MethodInvoker)AddItem);
}
}
private void AddItem()
{
listBox1.Items.Add("万万2邻期和尾");
listBox1.Items.Add("万万3邻期和尾");
listBox1.Items.Add("千千2邻期和尾");
listBox1.Items.Add("千千3邻期和尾");
listBox1.Items.Add("百百2邻期和尾");
listBox1.Items.Add("百百3邻期和尾");
listBox2.Items.AddRange(listBox1.Items); }
public delegate void InvokeDelegate(); //创建一个委托
private void button6_Click(object sender, EventArgs e)
{
AsyncCallback callback = new AsyncCallback((t) =>
{
this.Invoke(new Action<ListBox.ObjectCollection>(listBox2.Items.AddRange), listBox1.Items);
});
//开启多线程执行InvokeMethod方法,执行完毕后自动回调callback方法,完成listBox2内部项的添加。
new Action(InvokeMethod).BeginInvoke(callback ,null);
}
public void InvokeMethod()
{
if (this.InvokeRequired)
{
this.Invoke(new InvokeDelegate(AddItem));
}
}
private void AddItem()
{
listBox1.Items.Add("万万2邻期和尾");
listBox1.Items.Add("万万3邻期和尾");
listBox1.Items.Add("千千2邻期和尾");
listBox1.Items.Add("千千3邻期和尾");
listBox1.Items.Add("百百2邻期和尾");
listBox1.Items.Add("百百3邻期和尾");
}