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

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();

    评论

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站