Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用线程自动更新标签_C#_Multithreading_Winforms_Visual Studio 2010 - Fatal编程技术网

C# 如何使用线程自动更新标签

C# 如何使用线程自动更新标签,c#,multithreading,winforms,visual-studio-2010,C#,Multithreading,Winforms,Visual Studio 2010,我想从mod bus协议中获取数据,并使用标签在windows窗体中自动显示和更新数据。但是我遇到了一个问题,我必须单击按钮来显示更新的数据,而不是自动显示标签。下面是我的代码,有人能指出我错在哪里以及如何纠正它吗。非常感谢:) private void Call(){ 做 { RequestData();//从mod总线获取数据 运行(a.ToString()); }while(操作); } 委托无效调用方法(字符串数据); 专用void运行(字符串数据){ if(this.labelO2.i

我想从
mod bus
协议中获取数据,并使用标签在windows窗体中自动显示和更新数据。但是我遇到了一个问题,我必须单击按钮来显示更新的数据,而不是自动显示标签。下面是我的代码,有人能指出我错在哪里以及如何纠正它吗。非常感谢:)

private void Call(){
做
{
RequestData();//从mod总线获取数据
运行(a.ToString());
}while(操作);
}
委托无效调用方法(字符串数据);
专用void运行(字符串数据){
if(this.labelO2.invokererequired)
{
SetRichBoxCallBack d=新的SetRichBoxCallBack(运行);
调用(d,新对象[]{data});
}
否则{
labelO2.Text=数据;
}
}
螺纹;
私有无效按钮1\u单击(对象发送者,事件参数e)
{
线程=新线程(新线程开始(调用));
thread.Start();
}
public void RequestData()
{
if(WriteSerialPort(setMessage,0,8))
{
睡眠(1000);
对于(i=0;i<19;i++)
{
MM[i]=(字节)serialPortBoard.ReadByte();
}

a=MM[11]用以下代码替换您的代码:

private void run(string data) {

    //if (this.labelO2.InvokeRequired)
    //{
    //    SetRichBoxCallBack d = new SetRichBoxCallBack(run);
    //    this.Invoke(d, new object[] { data });
    //}
    //else {
    //    labelO2.Text = data;
    //}

    this.Invoke(new MethodInvoker(delegate {labelO2.Text = data;}));

}

它是windows窗体应用程序还是WPF?它是windows窗体应用程序。为什么要为相同的问题打开另一篇文章?可能重复:上一篇我没有清楚地描述我的问题。很抱歉,您是否尝试调试代码?执行期间是否出现任何异常?只有单击按钮才能更新最新数据。当我删除g、 没有例外。没有任何变化,当我使用计时器时,它工作正常。但当我尝试使用线程时,我仍然需要按钮将其更新为一件事。在
public void RequestData()中
函数,注释所有代码并更新一个变量。将此变量分配给标签文本。例如:取一个全局整数变量,在RequestData函数中递增,并在标签上显示它,然后检查它是否工作。我尝试过这样运行代码,标签正在正确更新。我尝试过,但它只能显示latest更新。我想向用户展示更新过程。有什么改进方法吗?
private void run(string data) {

    //if (this.labelO2.InvokeRequired)
    //{
    //    SetRichBoxCallBack d = new SetRichBoxCallBack(run);
    //    this.Invoke(d, new object[] { data });
    //}
    //else {
    //    labelO2.Text = data;
    //}

    this.Invoke(new MethodInvoker(delegate {labelO2.Text = data;}));

}