-2

私の問題は単純に、SQL クエリが完了するまでに 2 分以上かかることと、そのすべてのデータを取得しようとしている間にアプリケーションがフリーズすることができないことです。マルチスレッドを試してみましたが、あなたが認識していると確信しているエラーが発生し続けます。私のコードはその下にあります。

クロススレッド操作が無効です: コントロール 'labelEdit1' は、それが作成されたスレッド以外のスレッドからアクセスされました。

private void Form_Load(object sender, EventArgs e)
    {
        startup = new Thread(loadInThread);
        startup.Start();            
    }

private void loadInThread()
{
    //getsDataFromSQL() is the method that takes over 2 minutes to do
    //it returns a String Array if that is helpful
    comboEdit1.Properties.Items.AddRange(getsDataFromSQL());   
    startup.Abort();
}

これを行うためのより良い方法がある場合は、お知らせください。必要なのは、アプリケーションがフリーズせず、データがコンボエディットに読み込まれることだけです。また、SQLステートメントを最適化できることは知っていますが、それはこの質問の目的ではないため、提案しないでください.

4

2 に答える 2

1

ここではディスパッチャを使用する必要があります。これは、別のスレッドから UI スレッドが所有するコントロールにアクセスできないためです。こちらのリンクを確認してください。私はこれをコンパイルエラーについてチェックしていませんが、もちろん少し変更するだけでうまくいくはずです。

private void loadInThread()
{
    //getsDataFromSQL() is the method that takes over 2 minutes to do
    //it returns a String Array if that is helpful
    comboEdit1.Dispatcher.BeginInvoke((Action)(() =>
    {
        comboEdit1.Properties.Items.AddRange(getsDataFromSQL());   
    }));
    startup.Abort();
}
于 2013-08-22T09:31:05.523 に答える
1

マルチスレッド化はどうしていますか?手動でスレッドを作成していますか? そうしないでください。次の 3 つの方法のいずれかを使用することをお勧めします。

  1. async/ await- http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx (.NET 4.5+ のみ)
  2. タスク並列ライブラリ - http://msdn.microsoft.com/en-us/library/dd460717.aspx (.NET 4.0+ のみ)
  3. BackgroundWorker- http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

もちろん、スレッド ロジックを手動で処理することも可能です。その場合、おそらく BeginInvoke メソッドを調べたいと思うでしょう: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.begininvoke.aspx

于 2013-08-22T09:33:57.530 に答える