这些天在用事件的时候遇到了一个小问题,想了好久没有找到解决办法,后来在高手同事的帮助下终于顺利搞定。 这里写一个小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