我想在另一个线程中运行自己的类,但如果我这样做,我就不能在EventHandler
内使用我的标签,我该如何避免?
这就是我的代码的样子:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Ts3_Movearound
{
public partial class Form1 : Form
{
TS3_Connector conn = new TS3_Connector();
Thread workerThread = null;
public Form1()
{
InitializeComponent();
conn.runningHandle += new EventHandler(started);
conn.stoppedHandle += new EventHandler(stopped);
}
private void button1_Click(object sender, EventArgs e)
{
//System.Threading.Thread connw = new System.Threading.Thread(conn);
workerThread = new Thread(conn.Main);
workerThread.Start();
}
public void started(Object sender, EventArgs e)
{
label1.Text = "Status: Running!";
}
public void stopped(Object sender, EventArgs e)
{
label1.Text = "Status: Stopped!";
}
}
}
这就是错误:
行中的InvalidOperationExpetion“label1.Text =”状态:正在运行!“;”
答案 0 :(得分:5)
您只能通过UI线程更新控件。使用label1.Invoke()来做到这一点:
label1.Invoke((MethodInvoker)delegate {
label1.Text = "Status: Running!";"
});
答案 1 :(得分:1)
我会考虑使用BackgroundWorker。然后使用以下内容:
1)在调用RunWorkerAsync之前,将标签设置为running,因为没有线程问题。 2)如果设置任何控件使用后调用RunWorkerAsync:
label1.Invoke(new Action(() => label1.Text = @"Status: Running!"));
3)一旦完成该过程,您就可以通过为RunWorkerCompleted事件分配方法来将标签设置为停止。此方法中应该没有线程问题,因为它在主线程上运行。
答案 2 :(得分:0)