2011-06-23 13 views
0

私は膨大な数のWinFormコントロールを持つ関数LoadDataを持っており、データベースからのデータをコントロールにロードします。 は、今では私はイエスその後、plsは良いサンプルを示唆している場合、スレッドを使用する必要があり、非常に遅くなってきた、私はすでにMSDN sampleスレッドセーフな呼び出しのサンプルがありますか?

を試してみました。しかし、それは私には有用ではないですが、それは私のコードに変更を大量に必要となります。

+0

あなたはどのような種類のデータを読み込んでいるのか、どのようにして正確にする必要がありますか。また、あなたが何をしているのか –

+0

また、一般的に、スレッディングは、特にコアコードがスレッディングを意識することなく設計されていれば、かなりの量のリワークが必要です。 –

+0

ロードするデータ量サブセットをロードする方法が見つからないかどうかを確認してください。 – Tod

答えて

1

あなたは、UIとやりとりするコードがたくさんあり、バックグラウンドスレッドからやりたいと思っています。

あなたはこのようにメソッドを追加することができます。

private static void UpdateControl(Control control, Action action) 
{ 
    if (control.InvokeRequired) 
     control.Invoke(action); 
    else 
     action(); 
} 

用法:

古いを

textBox.Text = "Something"; 

UpdateControl(textbox,() => { textBox.Text = "Something" }); 

または延長方法、使用法を短くする

public static class ControlExtension 
{ 
    public static void UpdateControl(this Control control, Action<Control> action) 
    { 
     if (control.InvokeRequired) 
      control.Invoke((Action)(() => action(control))); 
     else 
      action(control); 
    } 
} 

使用法:

textBox.UpdateControl(arg => arg.Text = "Something"); 
+0

非常に良い簡潔な答え。拡張メソッドの主候補IYAM – sehe

+0

@sehe - yep。更新しました。 –

+0

@Alex Aza:関数に8/10のコントロールがある場合、またはそれ以上の場合は、control.InvokeRequiredとcontrol.Invokeが同時に実行されます。 – Akhil

0

.NET 4でTPLを使用すると、潜在的に簡単な方法でこれを処理できます。あなたがする必要があるのは、適切なTaskSchedulerを回すだけです。 UIコンテキストからTaskSchedulerを作成すると、必要に応じてUIスレッドで実行されるTaskに簡単に任意の呼び出しをラップすることができます。

詳細は、blog post on the subjectを参照してください。

0

チェックアウトBackgroundWorker

var bw = new BackgroundWorker(); 
bw.DoWork += (s, e) => e.Result = getAllBoxers(); 
bw.RunWorkerCompleted += (s, e) => 
    { 
     var boxers = e.Result as List<Boxer>; 
     dgvBoxers.DataSource = boxers; 
    }; 
bw.RunWorkerAsync(); 

DoWorkためのGUIに影響を与える何かを決してすることを確認しますWinFormsはスレッドセーフではありません。

関連する問題