2

別のスレッドからアプリケーションにアクセスする必要がありTextBoxesWPF例外が発生しました。Dispatcherすべての UI コントロールとメソッドにプロパティがあることはBeginInvoke知っていますが、から値を取得する方法がわかりませんTextBoxes

だから、ここにコードがあります:

private void TestConnection_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                var task = new Task(() => TryConnect());
                task.Start();
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message); 
            }
        }
        void TryConnect()
        {
            try
            {
                string con_str = "Server=" + Ip.Text + ";Port=" + Port.Text +
                ";Database=hospital;Uid=" + login.Text + 
                ";Pwd=" + password.Text + ";";
                using (MySqlConnection mcon = new MySqlConnection(con_str))
                {
                    mcon.Open();
                    MessageBox.Show("Connection is OK!");
                    mcon.Close();
                }
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.ErrorCode.ToString() + " " + ex.Message);
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }
        }
4

2 に答える 2

2

質問に答えるには、タスク アクションから接続文字列ビルドを移動します。

        private void TestConnection_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            string con_str = "Server=" + Ip.Text + ";Port=" + Port.Text + ";Database=hospital;Uid=" + login.Text + ";Pwd=" + password.Text + ";";

            var task = new Task(() => TryConnect(con_str));
            task.Start();
        }
        catch (Exception exc)
        {
            MessageBox.Show(exc.Message);
        }
    }
    void TryConnect(string con_str)
    {
        try
        {

            using (MySqlConnection mcon = new MySqlConnection(con_str))
            {
                mcon.Open();
                MessageBox.Show("Connection is OK!");
                mcon.Close();
            }
        }
        catch (MySqlException ex)
        {
            MessageBox.Show(ex.ErrorCode.ToString() + " " + ex.Message);
        }
        catch (Exception exc)
        {
            MessageBox.Show(exc.Message);
        }
    }

しかし、このコードには多くの問題があります。

  • WPF のコード ビハインドは「ベスト プラクティス」ではありません

  • 別のスレッドの MessageBox は、多くの苦痛を引き起こす可能性があります。

  • タスクの作成時に例外をキャッチしようとしていますが、これはアクション内でスローされた例外をキャッチしません。代わりにこれを試してください:

        private void TestConnection_Click(object sender, RoutedEventArgs e)
    {
        string con_str = "Server=" + Ip.Text + ";Port=" + Port.Text + ";Database=hospital;Uid=" + login.Text + ";Pwd=" + password.Text + ";";
        var dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher;
        var task = new Task(() => TryConnect(con_str));
        task.ContinueWith(task1 =>
            {
                //TODO Handle exception
                System.Diagnostics.Trace.WriteLine(task1.Exception);
                //or if you really want an messageBox, pass it back to the ui thread
                dispatcher.Invoke(() => MessageBox.Show(task1.Exception.Message));
    
            }, TaskContinuationOptions.OnlyOnFaulted);
        task.Start();
    }
    
于 2013-10-22T22:32:21.263 に答える