如何从不同于ApplicationContext线程的线程中显示表单

本文关键字:线程 显示 表单 ApplicationContext 不同于 | 更新日期: 2023-09-27 18:01:21

我正在尝试使一个windows应用程序在系统托盘中作为NotifyIcon启动,然后显示一些基于事件和用户输入的表单。我使用的是Visual Studio 2013

所以我所做的是删除默认表单VS创建并删除Application.run()Program.csApplication.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中启动了一个名为parentFormForm,然后在其上调用show,然后使其不可见。然后我调用它。但这似乎是一项肮脏的工作,而不是正确的工作;

如何从不同于ApplicationContext线程的线程中显示表单

        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();
    }

我没有测试它,但它可能是这样工作的。