肯定是非UI线程去操作button导致的了(也许你使用了SynchronizationContext,但是部分逻辑没有覆盖到),解决途径就是把这部分操作委托给UI线程去做。
void writelist()
{
new Task((delegate ()
{
for (int i = 0; i < Max_Item_Count; i++)
{
listView1.Invoke((MethodInvoker)delegate ()
{
listView1.Items.Add(new ListViewItem(new string[]
{ n.ToString(), string.Format("This is No.{0} item", n.ToString()) }));
n++;
Application.DoEvents();
});
};
//修改属性不可行,报错
button1.Text = "OK";
//修改背景颜色可行!不报错
button1.BackColor = Color.Red;
})).Start();
}
@😀明笔记:
你就不能格式化以下,,,不然怎么看。。。
void writelist()
{
new Task((delegate ()
{
for (int i = 0; i < Max_Item_Count; i++)
{
listView1.Invoke((MethodInvoker)delegate ()
{
listView1.Items.Add(new ListViewItem(new string[]
{
n.ToString(),
string.Format("This is No.{0} item", n.ToString())
}
));
n++;
Application.DoEvents();
});
};
//修改属性不可行,报错
button1.Text = "OK";
//修改背景颜色可行!不报错
button1.BackColor = Color.Red;
}
)).Start();
}
@😀明笔记: 着实很奇怪,不过我发现还有有些差异,Text是属于Control的,更改它最终会调用
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool SetWindowText(HandleRef hWnd, string text);
但是BackColor则仅只是基类的一个PropertyStore来存储变更即可。
其他线程访问UI线程创建的控件,这就是线程安全问题。解决的办法就是异步方式和设置CheckForIllegalCrossThreadCalls = false ;
我会处理这个问题。不过就是不理解。为什么有些报错。有些不报错
button1.Invoke((MethodInvoker)(()=>
{
//这里写逻辑
}));
我会处理这个问题。不过就是不理解。为什么有些报错。有些不报错
@😀明笔记: 1. 为什么“开始执行(不调试)”不会报错,”开始调试“就会报错
调试的时候调试器会查看是当前代码块有没有trycatch,如果没有,就会中断并提示你这里报错了,也就是说,哪怕你在其他地方捕获了这个异常,也会在这里提示。正式运行的时候,应该有捕获全局异常,所以没有报错。
既然“开始执行(不调试)”不会报错,那么使用这个窗体软件时,是不是可以忽略这个问题?忽略了会给我带来什么坏处?
不一定,如果这个异常是设计的一部分,可以忽略。
比如说你的代码是可能在UI线程上修改属性,也可能是在后台线程上修改属性,但是你想忽略后台线程的修改,这样的情况就可以忽略。
忽略这个问题可能造成的结果是界面显示不正确。
为什么修改button的背景颜色,不会报错,修改其他属性会报错?
不知道
改成异步调用就行了,这是winfrom程序常见的一个问题,如果用wpf的双向绑定就不会有这个问题
我会处理这个问题。不过就是不理解。为什么有些报错。有些不报错
@😀明笔记: 不可能吧
你贴出demo来看看
@会长: 例如修改button的背景颜色,就不会报错
@会长: void writelist()
{
new Task((delegate ()
{
for (int i = 0; i < Max_Item_Count; i++)
{
listView1.Invoke((MethodInvoker)delegate ()
{
listView1.Items.Add(new ListViewItem(new string[]
{ n.ToString(), string.Format("This is No.{0} item", n.ToString()) }));
n++;
Application.DoEvents();
});
};
//修改属性不可行,报错
button1.Text = "OK";
//修改背景颜色可行!不报错
button1.BackColor = Color.Red;
})).Start();
}
@😀明笔记: 没遇到过,我试试
子线程不能修改 主线程(UI线程)控件 。winfrom 规定 。没有为什么,
在其他语言也是一样, 比如安卓开发也是一样
那为什么修改button背景颜色也可以了?