You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从自定义ThreadProc线程调用Form1类的send方法?解决无限循环问题

问题解决:避免WinForm线程时钟的无限循环问题

你的核心问题是ThreadProc类中新建Form1实例导致循环触发构造函数,解决思路是把当前运行的Form1实例传递给ThreadProc,而不是每次新建。以下是修改后的代码:

修改ThreadProc类

添加构造函数接收Form1实例并保存为成员变量,这样threadP就能直接调用已有窗体的send方法:

internal class ThreadProc
{
    // 保存传入的Form1实例
    private readonly Form1 _targetForm;

    // 构造函数接收Form1实例
    public ThreadProc(Form1 form)
    {
        _targetForm = form;
    }

    public void threadP()
    {
        DateTime dateTime;
        do
        {
            dateTime = DateTime.Now;
            string time = dateTime.ToString(); 
            // 直接使用传入的Form1实例调用send
            _targetForm.send(time);
            Thread.Sleep(500);
        } while (true);
    }
}

修改Form1构造函数

创建ThreadProc时传入当前窗体实例this,避免新建Form1:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        // 传入当前Form1实例给ThreadProc
        ThreadProc tP = new ThreadProc(this);
        Thread t = new Thread(tP.threadP);
        t.Start();
    }

    public void send(Object obj)
    {
        string time;
        try
        {
            time = (string)obj;
        }
        catch (InvalidCastException)
        {
            time = " ";
        }
        if (label1.InvokeRequired)
            this.Invoke((MethodInvoker)delegate () { label1.Text = time; });
        else
            label1.Text = time;
    }
}

额外优化建议

  • 不需要每次循环都新建线程调用send,直接在threadP线程里调用即可,减少线程创建的开销。
  • 可以考虑用Task替代Thread,更符合现代.NET的异步编程模式。

内容的提问来源于stack exchange,提问作者xzysiek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:45:34