0

私はC#にかなり慣れていないので、何かに少し問題があります。スレッド化が答えかもしれないと信じていますが、それは解決策を探しているときに私が拾った流行語です。

名前空間テスト
{
    パブリック部分クラス Form1 : フォーム
    {
        プライベート Form2 form2;

        パブリック Form1()
        {
            InitializeComponent();
            form2 = 新しい Form2();
        }

        private void runCheck(オブジェクト ソース, System.Timers.ElapsedEventArgs e)
        {
            form2.ShowDialog();
            form2.TopMost = true;
        }

        プライベート ボイド runCheckFalse()
        {
            form2.Hide();
        }
}

これは、取り除かれたアプリケーションの簡単なコード スニペットにすぎませんが、これを実行しようとするとエラーが発生します。

また、補足として、私は form2.TopMost = true; を使用しています。他のすべての上にウィンドウを開こうとしますが、これは多くの場合、Visual Studio などの後ろで終わります

4

3 に答える 3

4

Invoke別のスレッドからフォームを操作するには、を使用する必要があります。

これは、複数のスレッドから Windows フォーム コントロールを操作する方法を説明する素晴らしい記事です:方法: Windows フォーム コントロールへのスレッド セーフな呼び出しを行う

これを試して:

namespace Test
{
    public partial class Form1 : Form
    {
        private Form2 form2;

        public Form1()
        {
            InitializeComponent();
            form2 = new Form2();
        }

        private void runCheck(object source, System.Timers.ElapsedEventArgs e)
        {
            if (form2.InvokeRequired)
            {
                form2.Invoke(new EventHandler(delegate { form2.ShowDialog(); form2.TopMost = true; }));
            }
            else
            {
                form2.ShowDialog(); 
                form2.TopMost = true;
            }
        }

        private void runCheckFalse()
        {
            if(form2.InvokeRequired)
            {
                form2.Invoke(new EventHandler(delegate { form2.Hide(); }));
            }
            else
            {
                form2.Hide();
            }
        }
    }
}
于 2012-07-08T21:03:07.163 に答える
1

次の方法で runCheckFalse メソッドを変更できます。これは、Windows フォームのかなり標準的なパターンです。

private void runCheckFalse()      
{       
    if(InvokeRequired)
      {
            BeginInvoke(new MethodInvoker(runCheckFalse));
            return;
      }                    
    form2.Hide();  
}

事実上、これが行うことは、GUI スレッド (" if InvokeRequired") で実行されているかどうかを確認することです。そうでない場合は、GUI スレッドで自分自身を呼び出し、すぐに戻ります。GUI スレッドで実行している場合は、何もする必要はなく、通常どおりメソッドを続行します。

パラメータを使用する必要がある場合:

private void runCheckFalse(bool someParameter)      
{       
    if(InvokeRequired)
      {
            BeginInvoke(new MethodInvoker(() => { runCheckFalse(someParameter);}));
            return;
      }                    
    form2.Hide();  
}
于 2012-07-08T21:10:15.517 に答える
0

WinForm コントロールは、UI スレッドからのみ更新できます。このブログ投稿 を見てください。更新が UI スレッドで確実に行われるようにするためのさまざまな方法が示されています。長い投稿ですが、読む価値があります。読む時間がない場合は、クイック アンド ダーティ アプローチが最初のアプローチです。

エリック

于 2012-07-08T20:55:50.850 に答える