使用多线程解决使用事件时的死锁问题

mac2022-06-30  69

 

这些天在用事件的时候遇到了一个小问题,想了好久没有找到解决办法,后来在高手同事的帮助下终于顺利搞定。 这里写一个小Demo 也许会对其他遇到类似问题的朋友有所帮助。

新建项目, 包括两个Form 一个类

Form1 调用Class1中方法ShowTimes(),使用事件来达到隔10秒钟在Form2 里显示一条时间目的。

Form1 代码:

namespace WindowsFormsApplication7

{

    class Class1

    {

        public static event EventHandler showTimeEvent;

 

        public static void ShowTimes()

        {

            for (int i = 0; i < 10000000; i++)

            {

                Thread.Sleep(1000);

                if (showTimeEvent != null)

                {

                    showTimeEvent(DateTime.Now.ToString(), EventArgs.Empty);

                }

            }

        }

 

    }

}

 

Form2 代码:

namespace WindowsFormsApplication7

{

    public partial class Form2 : Form

    {

        public Form2()

        {

            InitializeComponent();

        }

 

        private void Form2_Load(object sender, EventArgs e)

        {

            Class1.showTimeEvent += new EventHandler(Class1_showTimeEvent);

        }

 

        private delegate void ShowTimeDelegate();

 

        void Class1_showTimeEvent(object sender, EventArgs e)

        {

            ShowTimeDelegate handler = delegate()

            {

                this.textBox1.AppendText("\r\n"+sender.ToString());

                this.textBox1.ScrollToCaret();

                this.textBox1.Refresh();

            };

            if (this.InvokeRequired)

            {

                this.Invoke(handler);

            }

           else

            {

                handler();

            }

        }

    }

}

 

Class1代码

namespace WindowsFormsApplication7

{

    class Class1

    {

        public static event EventHandler showTimeEvent;

 

        public static void ShowTimes()

        {

            for (int i = 0; i < 10000000; i++)

            {

                Thread.Sleep(1000);

                if (showTimeEvent != null)

                {

                    showTimeEvent(DateTime.Now.ToString(), EventArgs.Empty);

                }

            }

        }

 

    }

}

 

 

虽然达到了间隔10秒在Form2里显示事件的目的,但遇到的问题是整个程序会死在那里,没有办法继续操作。

 

 

解决方法:

后来在同事告诉我这是因为程序被主线程占用导致的,可以使用线程多线程来解决:

Form1调用 ShowTimes()的时候新建另一个线程就可以了

Form2 form2 = new Form2();

form2.Show();

Thread t = new Thread(new ThreadStart(delegate() {

      Class1.ShowTimes();

}));

t.Start();

 

运行, OK

但是这样就产生了线程的同步问题,我是用另一个事件来控制的。

 

 

 

 

 

转载于:https://www.cnblogs.com/jianfeng/archive/2010/02/02/1662098.html

最新回复(0)