在 C# 的 Windows 窗体线程错误

标签: windows C#
发布时间: 2013/12/8 8:21:03
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我得到了此错误:

在 System.Windows.Forms.dll 中发生了未处理的异常的类型 '到当前页面'

其他信息: 跨线程操作无效: '红灯' 从创建它的线程以外的线程中访问控制。

红灯和绿光是 pictureBoxes。基本上,所有我想让它能做是每分每秒的每个图片之间交替。我搜索本网站的类似错误,我看到它,与"调用",但不知道什么人就是能给我点吗?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace EMCTool
{
    public partial class EMCTool_MainForm : Form
    {
        bool offOn = false;

        public EMCTool_MainForm()
        {
            InitializeComponent();
        }

        private void EMCTool_MainForm_Load(object sender, EventArgs e)
        {
            System.Threading.Timer timer = new System.Threading.Timer(new System.Threading.TimerCallback(timerCallback), null, 0, 1000);
        }

        private void timerCallback(object obj)
        {
            if (offOn == false)
            {
                Redlight.Show();
                offOn = true;
            }
            else
            {
                Greenlight.Show();
                offOn = false;
            }
        }
    }
}

解决方法 1:

当您尝试更新 UI 元素从它不在创建的任何线程时得到跨线程错误。

Windows 窗体中的控件绑定到特定的线程,并不是线程安全的。因此,如果你从另一个线程调用控件的方法,则必须使用其中一个控件的一个 invoke 方法来调用封送到正确的线程。此属性可用于确定是否必须调用 invoke 方法,如果你不知道什么线程拥有控件很有用。

请参阅在这里更多

尝试此操作。这对我来说工作正常

   if (pictureBoxname.InvokeRequired)
                    pictureBoxname.Invoke(new MethodInvoker(delegate
                    {
          //access picturebox here
                    }));
                else
        {

  //access picturebox here
}   
赞助商