Ancolie 2020-10-29 15:43 采纳率: 0%
浏览 706

C# WinForm窗体的多线程问题,多个用户控件界面开多个线程,多个线程之间来回跳跃

各位大佬们,我想要做个下图的窗体,treeview有三个节点,每个节点调出一个用户控件,三个界面是一样的。

图片说明

想要实现的功能是,点击开启线程,创建一个线程并调用计时器开始计时,计时器半秒给数值+1,关闭线程则丢弃线程。三个界面完全一致,但是发现三个界面的线程号会来回跳跃,说明线程一直在切换,而不是我想象中三个界面三个线程稳定执行。

UserControl的代码如下,三个界面一致。

请各位大佬指教,我的线程开闭有什么问题吗?怎么能实现我想要的功能呢??

public partial class UserControl1 : UserControl
    {
        private Thread m_multiGetTestThread;
        private Boolean m_multiGetTestThreadStart = false;
        System.Timers.Timer myTimer;

        static int i = 0;
        public UserControl1()
        {
            InitializeComponent();
        }
        private void UserControl1_Load(object sender, EventArgs e)
        {
            int interval = 500;
            myTimer = new System.Timers.Timer(interval);
            myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_tick);

            textBox3.Text = Thread.CurrentThread.ManagedThreadId.ToString();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            if (m_multiGetTestThreadStart == false)
            {
                m_multiGetTestThreadStart = true;
                m_multiGetTestThread = new Thread(connect);
                m_multiGetTestThread.Start();
                this.button1.Enabled = false;
            }
            textBox2.Text = m_multiGetTestThread.ThreadState.ToString();
            textBox3.Text = Thread.CurrentThread.ManagedThreadId.ToString();
        }

        private void connect()
        {
            i = 0;
            myTimer.Start();
        }
        private void myTimer_tick(object sender, EventArgs e)
        {
            textBox1.Text = i.ToString();            
            textBox2.Text = m_multiGetTestThread.ThreadState.ToString();
            textBox3.Text = Thread.CurrentThread.ManagedThreadId.ToString();
            i++;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            myTimer.Start();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            myTimer.Stop();
            textBox2.Text = m_multiGetTestThread.ThreadState.ToString();
            textBox3.Text = Thread.CurrentThread.ManagedThreadId.ToString();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            myTimer.Stop();
            m_multiGetTestThreadStart = false;
            m_multiGetTestThread.Abort();
            this.button1.Enabled = true;
            textBox2.Text = m_multiGetTestThread.ThreadState.ToString();
            textBox3.Text = Thread.CurrentThread.ManagedThreadId.ToString();
        }
    }
```**
  • 写回答

1条回答 默认 最新

  • Haven55555 2020-10-29 22:24
    关注

    没理解错的话
    感觉像是这句的问题 Thread.CurrentThread.ManagedThreadId.ToString();

    评论

报告相同问题?