线程代码如下:
private void doAsk()
{
string tmpData = "";
while (true)
{
if (lsv_List.Items.Count > 0)
{
for (int i = lsv_List.Items.Count - 1; i >= 0; i--)
{
tmpData = lsv_List.Items[i].Text; //这句话报错:线程间操作无效:
//从不是创建控件“lsv_ReaderList”的线程访问它。
}
}
else //则休眠100毫秒
{
Thread.Sleep(100);
}
}
}================================================
网上介绍跨线程为窗体控件赋值的文章很多,却没找到如何在线程中使用窗体控件数据的例子或说明,还请大家多多指教。
谢谢。
private void doAsk()
{
string tmpData = "";
while (true)
{
if (lsv_List.Items.Count > 0)
{
for (int i = lsv_List.Items.Count - 1; i >= 0; i--)
{
tmpData = lsv_List.Items[i].Text; //这句话报错:线程间操作无效:
//从不是创建控件“lsv_ReaderList”的线程访问它。
}
}
else //则休眠100毫秒
{
Thread.Sleep(100);
}
}
}================================================
网上介绍跨线程为窗体控件赋值的文章很多,却没找到如何在线程中使用窗体控件数据的例子或说明,还请大家多多指教。
谢谢。
public delegate void GetListDataHandler(Control list, int i);
public GetListDataHandler getData;
private strText=string.Empty;
private void GetListData(Control list, int i)
{
strText = list.Items[i].Text;
}在线程中调用:this.BeginInvoke(this.getData, new object[] { lsv_List, i});随便写的,应该可行。 自己再优化下。
getData = GetListData;
private void doAsk()
{ InvokeDelegate beginProcess = delegate()
{
你要访问数据的语句
};
this.Invoke(beginProcess);
}
在线程中更新主线程中的Label1的Text:private delegate void SetTextHandler(string text);private void setTextInner(string text)
{
Label1.Text = text;
}private void setText(string text)
{
if(InvokeRequired)
{
SetTextHandler sth = setTextInner;
Invoke(sth,new object[]{text});
}
else
{
setTextInner(text);
}
}那么你在其他线程中修改Label1的文本时,调用setText就可以了,而如果你直接调用setTextInner是不能直接更新Label1的,不同线程就好比不同房间,你在书房是不能直接操作客厅的东西的,你首先要在客厅提供一个代理,在书房使用这个代理,注册一个入口,然后才可以直接操作。