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

时间:2016-08-09 07:42:48

标签: c# .net multithreading

我正在尝试将一个以系统托盘开头的Windows应用程序作为NotifyIcon,然后根据事件和用户输入显示一些表单。 我正在使用Visual Studio 2013

所以我做的是删除默认表单VS创建并从Application.run()删除Program.cs并执行Application.run(new MyApplicationContext())其中MyApplicationContext是一个扩展{{1}的类}我初始化并显示ApplicationContext

然后我创建了一个woker线程,用于查询数据库以获取信息,并尝试在我创建的NotifyIcon中显示该信息。

如果我在woker线程代码中执行类似的操作:

NotificationForm

通知显示在默认位置,其上的任何UI元素都显示为透明,我可以看到桌面

但是,如果我在工作线程中调用NotificationForm form = new form(); form.Top = // change the location; form.show(); ,则表单正常工作并显示在正确的位置,但它会阻止我的工作线程。

如果我有Application.run(form),我会在Form上致电Invoke。但在我的情况下,我该怎么办?

编辑:作为一种解决方法,我在Form中发起了一个名为Form的{​​{1}},然后在其上显示了show,然后将其隐藏起来。然后我从那里调用。但这似乎是一个肮脏的工作而不是正确的工作;

1 个答案:

答案 0 :(得分:-1)

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

我没有测试它,但它可能会那样。