-1

C# を使用した WPF アプリケーションにはバックエンドがあります。マルチスレッドにしたい。

さまざまなものをリストするコンボボックスがあります。また、ユーザーはそれらを非同期で選択できます。

コンボボックス 1 に 1.ABC 2.BCD 3.CDE が含まれているとします。

ユーザーが ABC を選択すると実行が開始され、ABC をクリックする前に BCD をクリックすると、再び実行されます。

そのように、マルチスレッドの wpf アプリケーションが必要です。

    private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        System.Windows.Forms.MessageBox.Show( "Executing " + newList[ comboBox1.SelectedIndex]  + " test case" );


        this.IsEnabled = false;


        Thread objThread = new Thread(() =>
        {
            Process p = new Process();
            p.StartInfo.WorkingDirectory = listofDirs[comboBox1.SelectedIndex] + "\\" + newList[comboBox1.SelectedIndex] + "\\" + @"\bin\Release";
            p.StartInfo.FileName = listofDirs[comboBox1.SelectedIndex] + "\\" + newList[comboBox1.SelectedIndex] + "\\" + @"\bin\Release" + "\\" + newList[comboBox1.SelectedIndex] + ".exe";
            p.StartInfo.CreateNoWindow = false;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
            p.Start();
            p.WaitForExit();
        });


        objThread.IsBackground = true;

        objThread.Priority = ThreadPriority.AboveNormal;

        objThread.Start();


        this.IsEnabled = true;





    }
4

1 に答える 1

3

繰り返しますが、UI コントロールを作成したスレッド以外のスレッドからは、UI コントロールにアクセスできません。Control.Invokeそのためには、 for Windows Forms またはDispatcher.Invokefor WPFを使用する必要があります。

あなたの場合、スレッドはで選択されたアイテムのインデックスにアクセスしようとしますがComboBox、これは無効なクロス スレッド操作です。それをスレッドメソッドの外に移動すると、準備が整います。

于 2012-05-07T08:05:21.220 に答える