如何从自定义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
相关产品推荐
相关产品推荐

