线程和调用,如何修改标签

本文关键字:修改 标签 何修改 调用 线程 | 更新日期: 2023-09-27 18:04:06

我在c#中工作的应用程序,我有一个问题,我的线程和我的UI…

当线程运行时,我想在我的标签上添加+1。问题是我不知道如何解决这个问题……我读了很多"如何",但解决方案不工作与我的应用程序..

我的线程类:

 class clsWorker
    {
        //Thread myThread = new Thread(new ThreadStart(ThreadLoop));
        public SerialPort port;
        public String url;
        Thread t;
        clsSMS clsobjSMS = new clsSMS();
        SMSapplication clsobjAPP = new SMSapplication();
        public clsWorker(SerialPort serialPort, String urlChamp)
        {
            this.port = serialPort;
            this.url = urlChamp;
        }

        public void StartThread()
        {   
            t = new Thread(new ThreadStart(ThreadLoop));
            t.Start();
        }

        public void ThreadLoop()
        {
             // How I can add +1 on the countSMSok label ??
             clsobjAPP.updateCountSMS("countSMSok");
        }
    }

我的应用类:

public partial class SMSapplication : Form
    {
public void updateCountSMS(String label)
    {
        int num;
            this.countSMSnok = new System.Windows.Forms.Label();
            this.countSMSok = new System.Windows.Forms.Label();
            this.Controls.Add(this.countSMSnok );
            this.Controls.Add(this.countSMSok );

         if (label == this.countSMSok.Name.ToString())
        {
           if (int.TryParse(this.countSMSok.Text.ToString(), out num))
                this.countSMSok.Invoke((MethodInvoker)(() => this.countSMSok.Text = num++.ToString()));
        }
        else if (label == this.countSMSnok.Name.ToString())
        {
            if (int.TryParse(this.countSMSnok.Text.ToString(), out num))
                this.countSMSnok.Invoke((MethodInvoker)(() => this.countSMSnok.Text = num++.ToString()));
        }  
    }
       private void btnRequestStart_Click(object sender, EventArgs e)
    {
        this.btnRequestStart.Enabled = false;
        this.btnRequestStop.Enabled = true;
        objclsWorker = new clsWorker(this.port, this.urlChecker.Text);
        objclsWorker.StartThread();
    }
}

非常感谢您的帮助

线程和调用,如何修改标签

确保创建了标签的实例并将标签添加到控件

    this.countSMSnok = new System.Windows.Forms.Label();
    this.countSMSok = new System.Windows.Forms.Label();
    this.Controls.Add(this.countSMSnok );
    this.Controls.Add(this.countSMSok );

您不能初始化SMSapplication类的新对象,更新它并期望它更新您的第一个表单。这些是不同的"东西"。另外,您应该使用SynchronizationContext而不是invoke

下面是工作代码:

形式:

public partial class SMSapplication : Form
{
    private SynchronizationContext context = null;
    private SerialPort port;
    public SMSapplication()
    {
        InitializeComponent();
        this.countSMSok.Text = "0";
        this.context = WindowsFormsSynchronizationContext.Current;
    }
    public void updateCountSMS(String label)
    {
        this.context.Post(new SendOrPostCallback(updateCountSMSSync), label);
    }
    private void updateCountSMSSync(object o)
    {
        string label = o as string;
        int num;
        if (label == this.countSMSok.Name.ToString())
        {
            if (int.TryParse(this.countSMSok.Text.ToString(), out num))
            {
                this.countSMSok.Text = (++num).ToString();
            }
        }
    }
    private void btnRequestStart_Click(object sender, EventArgs e)
    {
        clsWorker objclsWorker = new clsWorker(this, this.port, this.urlChecker.Text);
        objclsWorker.StartThread();
    }
}

和工人:

class clsWorker
{
    public SerialPort port;
    public String url;
    SMSapplication clsobjAPP = null;
    public clsWorker(SMSapplication app, SerialPort serialPort, String urlChamp)
    {
        this.clsobjAPP = app;
        this.port = serialPort;
        this.url = urlChamp;
    }
    public void StartThread()
    {
        new Thread(new ThreadStart(ThreadLoop)).Start();
    }

    public void ThreadLoop()
    {
        clsobjAPP.updateCountSMS("countSMSok");
    }
}