c# - Winforms UI 在加载新的时冻结
问题描述
我正在尝试制作一个异步计时器,它将关闭所有打开的表单(以线程安全的方式)(除了BaseWindow
)并打开一个新LoginScreen
表单。目前所有表单都已关闭,但当新LoginScreen
表单启动时,它的 UI 被冻结。
代码如下所示:
{
public static Form[] OpenForms
{
get
{
Form[] forms = null;
int count = Application.OpenForms.Count;
forms = new Form[count];
if (count > 0)
{
int index = 0;
foreach (Form form in Application.OpenForms)
{
forms[index++] = form;
}
}
return forms;
}
}
delegate void CloseMethod(Form form);
static private void CloseForm(Form form)
{
if (!form.IsDisposed)
{
if (form.InvokeRequired)
{
CloseMethod method = new CloseMethod(CloseForm);
form.Invoke(method, new object[] { form });
}
else
{
form.Close();
}
}
}
static public void CloseAllForms()
{
// get array because collection changes as we close forms
Form[] forms = OpenForms;
// close every open form
foreach (Form form in forms)
{
if (form.GetType() != typeof(BaseWindow))
{
CloseForm(form);
}
}
}
private void PollUpdates(object sender, EventArgs e)
{
;
if (Program.Globalsession.SessionId != default(Guid))
{
if (DateTime.Compare(Program.Globalsession.ValidTo, DateTime.Now) < 0)
{
CloseAllForms();
var login = new LoginScreen();
login.Show();
}
}
}
public BaseWindow()
{
InitializeComponent();
var login = new LoginScreen();
login.Show();
var theTimer = new System.Timers.Timer(5000);
theTimer.Elapsed += PollUpdates;
theTimer.Start();
}
}
知道我在做什么错吗?
解决方案
我猜你使用了错误的计时器类型。使用System.Windows.Forms.Timer
(而不是System.Timers.Timer
)。详情在这里。
因此,您是LoginScreen
在 UI 线程以外的线程上创建的。
推荐阅读
- amazon-web-services - AWS CloudWatch - 如何删除.NET Core 默认登录的 LogLevel 和 Class?
- mongodb - MongoDB如何访问预先存在的集合?
- c++ - 使用opencv c ++(多线程)进行多摄像头捕获,但速度与串行速度相同
- html - 如何用 Tampermonkey 替换 html 标签?
- java - 无法让我的 java 类显示正确的值(游戏)(让所有随机损坏工作,以及健康)
- azure - 用于提取所有 API、它们的操作和入站策略的 Powershell 脚本
- c# - 使用流套接字时,如何使用 MVVM 从其他线程/任务更新 C# UWP 用户界面?
- msbuild - MSBuild 从设置为不复制的项目目录中复制 DLL
- c# - 真正的并行处理
- r - dashboardBody 没有显示来自 Shinydashboard 的 conditionalPanel 的正确图形