【发布时间】:2022-11-23 06:00:50
【问题描述】:
我正在尝试如上所述更改文本框的颜色,我只是要显示代码,因为我认为这将是最合适的解释。
private async Task Disco()
{
int duration;
switch (ptr)
{
default:
//duration = 900;//15 min
duration = 10;
break;
case 1:
duration = 50;
//duration = 1800;//30 min
break;
}
int color = 0;
await Task.Run(() =>
{
while (duration-- != 0)
{
TB.ForeColor = foreground[color];
TB.BackColor = background[color];
if (++color == foreground.Length)
color = 0;
Thread.Sleep(1000);
}
});
TB.ForeColor = Color.Black;
}
前景色一直工作正常,但是当我添加背景线时它抛出
“System.Windows.Forms.dll 中出现类型为‘System.InvalidOperationException’的异常,但未在用户代码中处理 跨线程操作无效:从创建它的线程以外的线程访问控制“TB”。
这怎么可能???
我实际上是在上面的行中使用前景色访问它,为什么背景色表现不同???
如果我将背景色线作为评论,一切都会好起来....
为文本框制作静态变量无济于事。
我正在使用 .net 3.1(用于 win 7),但这不应该是这里的问题。
【问题讨论】:
-
您应该使用 Task.Delay 而不是 Thread.Sleep。
-
@hijinxbassist 这对背景色有何帮助?延迟不是这里的问题。
-
foreground和background是如何定义的?我推断它们是数组,并且可能属于嵌入此代码的表单或控件。 -
您应该调用所有 ui 调用,因为它们不在 ui 线程上运行。
-
ForeColor 的 setter 无一例外地在 UI 线程以外的线程上执行,这只是一个幸运的巧合。不过,UI 元素的修改应该只在 UI 线程的上下文中完成。