如何从不同于ApplicationContext线程的线程中显示表单
本文关键字:线程 显示 表单 ApplicationContext 不同于 | 更新日期: 2023-09-27 18:01:21
我正在尝试使一个windows应用程序在系统托盘中作为NotifyIcon
启动,然后显示一些基于事件和用户输入的表单。我使用的是Visual Studio 2013
所以我所做的是删除默认表单VS创建并删除Application.run()
从Program.cs
和Application.run(new MyApplicationContext())
MyApplicationContext
是一个类扩展ApplicationContext
我初始化并显示NotifyIcon
然后我创建了一个工作线程,它查询数据库中的信息,并试图在我创建的NotificationForm
中显示该信息。
如果我在工作线程代码中这样做:
NotificationForm form = new form();
form.Top = // change the location;
form.show();
通知显示在默认位置,上面的任何UI元素都是透明的,我可以看到桌面
但是如果我在工作线程中调用Application.run(form)
,则表单工作正确并显示在正确的位置,但它阻塞了我的工作线程。
如果我有一个Form
,我将在Form
上调用Invoke
。但我的情况下该怎么办呢?
EDIT:作为解决方案,我在MyApplicationContext
中启动了一个名为parentForm
的Form
,然后在其上调用show,然后使其不可见。然后我调用它。但这似乎是一项肮脏的工作,而不是正确的工作;
BackgroundWorker _backgroundWorker;
private void Init()
{
_backgroundWorker = new BackgroundWorker();
_backgroundWorker.WorkerReportsProgress = true;
_backgroundWorker.ProgressChanged += _backgroundWorker_ProgressChanged;
_backgroundWorker.DoWork += _backgroundWorker_DoWork;
_backgroundWorker.RunWorkerAsync();
}
private void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker backgroundWorker = sender as BackgroundWorker;
Thread.Sleep(5000);
backgroundWorker.ReportProgress(0);
Thread.Sleep(5000);
backgroundWorker.ReportProgress(10);
}
private void _backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Form form = new Form();
form.Text = "Percentage:" + e.ProgressPercentage.ToString();
form.Show();
}
我没有测试它,但它可能是这样工作的。