【问题标题】:Can change forecolor but not backcolor of textbox in async task可以在异步任务中更改前景色但不能更改文本框的背景色
【发布时间】: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 这对背景色有何帮助?延迟不是这里的问题。
  • foregroundbackground 是如何定义的?我推断它们是数组,并且可能属于嵌入此代码的表单或控件。
  • 您应该调用所有 ui 调用,因为它们不在 ui 线程上运行。
  • ForeColor 的 setter 无一例外地在 UI 线程以外的线程上执行,这只是一个幸运的巧合。不过,UI 元素的修改应该只在 UI 线程的上下文中完成。

标签: c# winforms


【解决方案1】:

正如 hijinxbassist 和 MySkullCaveIsADarkPlace 所说,我很幸运地看到了前台,不得不调用 UI 调用。

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多