2016-08-09 7 views
1

システムトレイで起動するWindowsアプリケーションをNotifyIconとして作成しようとしていて、イベントとユーザー入力に基づいていくつかのフォームが表示されます。私は私がしたので、何のVisual Studio 2013ApplicationContextスレッドとは別のスレッドからフォームを表示する方法

を使用してい は、VSが作成するデフォルトのフォームを削除し、MyApplicationContext私は初期化ApplicationContextを拡張するクラスですProgram.csからApplication.run()とやったApplication.run(new MyApplicationContext())を削除し、NotifyIcon

を示しています

その後、私はデータベースに情報を問い合わせて、自分が作成したNotificationFormの情報を表示しようとするワーカースレッドを作った。

私はwokerスレッドコードでこのような何かを行う場合は、次の

NotificationForm form = new form(); 
form.Top = // change the location; 
form.show(); 

通知はデフォルトの位置で示し、その上に任意のUI要素が透明に見えると私はシースルーことができますデスクトップに

しかし、Application.run(form)をワーカースレッドで呼び出すと、フォームは正しく機能し、正しい位置に表示されますが、ワーカースレッドはブロックされます。

Formの場合は、FormにはInvokeと表示されます。しかし、私の場合は何をすべきですか?

EDIT:それは、それが見えないように上回避策としては、私はMyApplicationContextその後と呼ばれるショーに呼ばFormparentFormを開始しました。それから私は呼びます。しかし、それは正しいものではなく汚れた作業のように見える。

+1

なぜ私は下位投票に値するのですか? – vlatkozelka

+0

新しいスレッドをスピンアップし、そのスレッドで 'Application.Run(form);'を実行しようとしましたか? –

答えて

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

私はそれをテストしませんでしたが、そのように動作するかもしれません。

関連する問題