私は膨大な数のWinFormコントロールを持つ関数LoadData
を持っており、データベースからのデータをコントロールにロードします。 は、今では私はイエスその後、plsは良いサンプルを示唆している場合、スレッドを使用する必要があり、非常に遅くなってきた、私はすでにMSDN sampleスレッドセーフな呼び出しのサンプルがありますか?
を試してみました。しかし、それは私には有用ではないですが、それは私のコードに変更を大量に必要となります。
私は膨大な数のWinFormコントロールを持つ関数LoadData
を持っており、データベースからのデータをコントロールにロードします。 は、今では私はイエスその後、plsは良いサンプルを示唆している場合、スレッドを使用する必要があり、非常に遅くなってきた、私はすでにMSDN sampleスレッドセーフな呼び出しのサンプルがありますか?
を試してみました。しかし、それは私には有用ではないですが、それは私のコードに変更を大量に必要となります。
あなたは、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");
.NET 4でTPLを使用すると、潜在的に簡単な方法でこれを処理できます。あなたがする必要があるのは、適切なTaskScheduler
を回すだけです。 UIコンテキストからTaskScheduler
を作成すると、必要に応じてUIスレッドで実行されるTask
に簡単に任意の呼び出しをラップすることができます。
詳細は、blog post on the subjectを参照してください。
チェックアウト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はスレッドセーフではありません。
あなたはどのような種類のデータを読み込んでいるのか、どのようにして正確にする必要がありますか。また、あなたが何をしているのか –
また、一般的に、スレッディングは、特にコアコードがスレッディングを意識することなく設計されていれば、かなりの量のリワークが必要です。 –
ロードするデータ量サブセットをロードする方法が見つからないかどうかを確認してください。 – Tod