winforms 如何从线程调用Form类中的方法

mqxuamgl  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(146)

我正在尝试用线程创建一个简单的时钟程序。在Form 1中,我想创建一个新线程,该线程位于ThreadProc()中,花费一些时间,然后发送回Form 1的send()方法,该方法将替换label中的文本。
第一个
它最终进入Form 1()-〉threadP()-〉Form 1()的无限循环......但没有

Form1 form1 = new Form1();

我无法调用send()in

Thread t = new Thread(() => form1.send(time));

threadP()必须在它们自己的类中,send()必须在Form 1类中。

knsnq2tg

knsnq2tg1#

将对窗体的引用传递给线程。然后可以从该线程访问它。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        ThreadProc tP = new ThreadProc();
        Thread t = new Thread(tP.threadP);

        // Automatically end thread when application ends
        t.IsBackground = true;
        
        // Pass reference to this form to thread
        t.Start(this);
    }

    public void Send(string time)
    {
        if (Visible) // Check form wasn't closed
        {
            if (label1.InvokeRequired)
                this.Invoke((MethodInvoker)delegate () { label1.Text = time; });
            else
                label1.Text = time;
        }
    }
}

internal class ThreadProc
{
    public void threadP(object data)
    {
        // Get Form1 reference from start parameter
        Form1 form1 = data as Form1;
        
        DateTime dateTime;
        do
        {
            dateTime = DateTime.Now;
            string time = dateTime.ToString();
            form1.Send(time);
            Thread.Sleep(500);
        } while (true);
    }
}

注意,有更好的设计来重用线程,比如传递一个接口而不是具体的Form1类。
当窗体和后台线程紧密绑定在一起时,通常使用BackgroundWorker而不是线程。

相关问题