私はプロではなく熱心な開発者であるため、一部の問題が現状のままである理由について高度な技術的理解を持っていません。最近、私はバックグラウンドワーカーを使用してさまざまなデータベース呼び出しを処理することで応答性を改善しようとしているアプリケーションに取り組んでいます。
バックグラウンドワーカーが完了したら、UI を更新する必要があるため、通常は次のようなことを行います。
private delegate void safeSetTextDelegate(Control control, string text);
public static void SafeSetText(this Control control, string text)
{
if(control.InvokeRequired)
{
safeSetTextDelegate _delegate = new safeSetTextDelegate(SafeSetText);
control.Invoke(_delegate, new object[] { control, text});
}
else
{
control.Text = text;
}
}
さて、明らかにこれは機能します。しかし、必要な拡張メソッドの数が増え始めるにつれて (スタイルの設定、子コントロールの動的な追加、データグリッドビューへの行の追加などのためにそれらを持っています)、なぜ利用可能な標準メソッドのセットがないのか疑問に思っていましたこれらのタイプのもののための.Net WinForms言語/モデル、またはInvokeRequiredチェックが舞台裏で自動的に行われず、必要に応じてデリゲートが適用されない理由さえあります(私の推測では、これはパフォーマンスの問題であると思います-呼び出しをチェックする理由ほとんどの場合、単に必要ではないスレッド)。私はこれを調査しようとしましたが、まともな答えは見つかりませんでした。
これを一連の質問にまとめるとしたら、次のようになります。
- 私のアプローチに本質的に悪い/間違っているものはありますか(チェックする拡張メソッドを介してコントロールを更新するバックグラウンドワーカー
InvokeRequired
) - .Net WinForms のさまざまなメソッドが自動的に正しいチェックを行わない理由
InvokeRequired
(InvokeRequired の呼び出しにどれだけのオーバーヘッドがあるか) についての私の考えはありますか? - 同様に、一般的な UI 更新用のスレッドセーフなメソッドが .Net WinForms 仕様に存在しない理由はありますか?