我正在嘗試制作一個異步計時器,它將關閉所有打開的表單(以執行緒安全的方式)(除了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();
}
}
知道我做錯了什么嗎?
uj5u.com熱心網友回復:
我猜你使用了錯誤的計時器型別。使用System.Windows.Forms.Timer(而不是System.Timers.Timer)。詳情請看這里。
因此,您是LoginScreen在 UI 執行緒以外的執行緒上創建的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/342659.html
上一篇:關閉表單不會關閉應用程式
