【发布时间】:2020-10-01 23:06:10
【问题描述】:
只有在有事件时才打开表单,如果没有事件,则它不应该显示在屏幕上。所以基本上我想用一个计时器来做到这一点。一个 exe 将持续运行,并且每分钟它都会检查数据库以查看是否有数据,如果有数据,是否会显示在屏幕上,并且只会通过用户交互手动关闭。一分钟后,它会再次检查并显示数据库中是否存在数据。
我在 Program.cs 文件中使用 system.threading.Timer 每分钟打开一个窗口。下面是代码
timer = new System.Threading.Timer((s) => {
EL.CustomMessageBox l = new EL.CustomMessageBox();
l.ShowDialog();
}, null, TimeSpan.Zero, 60000);
一段时间后,我看到这个 exe 仍在任务管理器中运行,但即使数据库中有数据,它也会停止显示在屏幕上。任何帮助表示赞赏。
【问题讨论】:
-
在创建新的对话框对象之前放置一条控制台日志消息,以查看计时器是否仍在触发 - 这至少会告诉您问题是与对话框相关还是计时器正在消亡。跨度>
-
您不能在非 UI 线程上创建、访问或更新任何 UI 元素。
-
除了只在 UI 线程上运行之外,还可以考虑最小化和恢复表单,而不是让模态对话框弹出然后消失。
-
@Enigmativity:这完全是真的。您在其中创建 UI 元素的任何线程都是 UI 线程。
-
您需要一个消息泵。不是创建线程那么简单。