你的位置:
问答吧
-> .NET
-> 问题详情
多线程访问控件问题
这是winform程序,用线程控制一个ListBox控件
后台代码如下:
private void MainFrom_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
System.Threading.Timer listBoxt = new System.Threading.Timer(new TimerCallback(qingchu), "", Timeout.Infinite, Timeout.Infinite);
listBoxt.Change(120000, 120000);
}
public void qingchu(object a)
{
try
{
if (this.ListBox.Items.Count > 100)
this.ListBox.Items.Clear();
}
catch (Exception e)
{
WriteDugLogUtil.WriteDugLogs("listbox问题" + e.ToString());
}
}
程序在this.ListBox.Items.Clear();这句话报下面的错
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 System.Windows.Forms.ListBox.ObjectCollection.ClearInternal()
有线程是给listbox加项的。不明白为什么会报控制针?明明this.ListBox.Items.Count这个都大于一百了,怎么还报空指针?
作者: lion_strong
发布时间: 2011-10-09
工作线程访问界面,最好用Invoke,
作者: stonespace
发布时间: 2011-10-09
也可能是其他地方同步操作ListBox,可以考虑锁定ListBox,
lock(ListBox)
{
}
作者: stonespace
发布时间: 2011-10-09
你在使用多线程同时操作一个控件的时候,需要对被操作的控件进行同步操作
作者: wangyong0921
发布时间: 2011-10-09
用invokerequired和beigininvoke
作者: mabaolin
发布时间: 2011-10-09
void m_comm_MessageEvent( string msg)
{
if (txtMessage.InvokeRequired)
{
InvokeCallbackmsgCallback = new InvokeCallback(m_comm_MessageEvent);
txtMessage.Invoke(msgCallback, new object [] { msg } );
}
else
{
txtMessage.Text = msg;
}
}
作者: sj97a007
发布时间: 2011-10-09