线程和调用,如何修改标签
本文关键字:修改 标签 何修改 调用 线程 | 更新日期: 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");
}
}