基础问题,C#没人了吗?

空白已存在 2019-01-16 10:23:17
 private void button2_Click(object sender, EventArgs e)
{
System.Timers.Timer t = new System.Timers.Timer(1000); //实例化Timer类,设置间隔时间为5毫秒;
t.Elapsed += new System.Timers.ElapsedEventHandler(theout); //到达时间的时候执行事件;
t.AutoReset = false; //设置是执行一次(false)还是一直执行(true);
t.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件;
}

public void theout(object source, System.Timers.ElapsedEventArgs e) {
Form2 form2 = new Form2();
form2.Show();

}

为什么在Elapsed事件里显示新窗口,窗口会卡死???
...全文
1144 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zff123 2019-02-14
  • 打赏
  • 举报
回复
同意5楼的原理。
上帝的亲哥哥 2019-02-14
  • 打赏
  • 举报
回复
你用的Timer是不是真正多线程的Timer,你可用线程Timer就好了,你这样改一下也行,就不卡死了:

private void button1_Click(object sender, EventArgs e)
{
System.Timers.Timer t = new System.Timers.Timer(1000); //实例化Timer类,设置间隔时间为5毫秒;

t.Elapsed += new System.Timers.ElapsedEventHandler(theout); //到达时间的时候执行事件;
t.AutoReset = false; //设置是执行一次(false)还是一直执行(true);
t.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件;
}

public void theout(object source, System.Timers.ElapsedEventArgs e)
{
if (this.InvokeRequired)
{
var action = new Action<object, System.Timers.ElapsedEventArgs>(theout);
this.BeginInvoke(action, source, e);
}
else
{
Form2 form2 = new Form2();
form2.Show();
}

Application.DoEvents();
}
threenewbee 2019-01-25
  • 打赏
  • 举报
回复
不要在非UI线程里更新界面
liusa1997 2019-01-24
  • 打赏
  • 举报
回复
我是这么理解的:你的点击事件执行的timer,但是这是在主线程里面执行的,现在你打开子窗体(子线程),但是主线程反复去暂停,然后资源抢夺了,线程之间造成死锁,其实一般直接invoke就能解决问题
  • 打赏
  • 举报
回复
引用 3 楼 空白已存在 的回复:
]false,不是只会打开一次么?
不是打开一次的意思。
SoulRed 2019-01-23
  • 打赏
  • 举报
回复
用委托对UI进行操作
或者试试reactiveX
小刘哈哈 2019-01-22
  • 打赏
  • 举报
回复
窗口无限打开,1秒一个
exception92 2019-01-16
  • 打赏
  • 举报
回复
使用System.Timers.Timer会创建新的线程,而非UI线程,在theout中操作UI,需要使用Invok或者begininvoke 来执行委托去操作由UI线程创建的窗体或者控件即可。
  • 打赏
  • 举报
回复

public void theout(object source, System.Timers.ElapsedEventArgs e)
{
BeginInvoke(new EventHandler(delegate
{
Form2 form2 = new Form2();
form2.Show();
}));
}
空白已存在 2019-01-16
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
打开了太多窗体,资源耗尽了
false,不是只会打开一次么?
xuzuning 2019-01-16
  • 打赏
  • 举报
回复
打开了太多窗体,资源耗尽了
  • 打赏
  • 举报
回复
多线程操作UI线程?死锁了吧
太阳的星星 2019-01-16
  • 打赏
  • 举报
回复
要断定是否主线程调用,及线程同步问题。
橘子皮... 2019-01-16
  • 打赏
  • 举报
回复
不管是不是主线程里,加个委托总不会错的 form.timer是阻塞的,其他2种timer都是独立线程
ilikeff8 2019-01-16
  • 打赏
  • 举报
回复

public void theout(object source, System.Timers.ElapsedEventArgs e)
{
this.Invoke((Action)(() =>
{
Form2 form2 = new Form2();
form2.Show();
}));
}
圣殿骑士18 2019-01-16
  • 打赏
  • 举报
回复
请区别
System.Timers.Timer

System.Windows.Forms.Timer

后者按你的写法是可以的。
前者是独立线程运行,按4楼做法

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧