0

.Net 4.0 と VS2010 を使用しています。

私のプログラムは、バインディングリストを更新し、DataGridView を介してリストを表示するマルチスレッドの get リクエスト送信者です。datagridview は仮想モードです。さらに、リクエストのステータスを表示するテキスト ボックスとステータス バーを作成します。通常、1 つのリクエストは、テキスト ボックスに 4 ~ 5 行を追加し、ステータス バーの数字を変更します。

ワークロードは同じままで、2 秒ごとに 1 つのリクエストです。リクエストは高速で、ほとんどの場合、1 つのリクエストだけが目立ちます。新しいリクエスト スレッドは、最後の古いリクエスト スレッドによって呼び出されます。UI は、begininvoke とデリゲートを使用してスレッドごとに数回更新されます。

MyInvoke mi = new MyInvoke(change);
this.BeginInvoke(mi, new Object[] { true, "Row " + pos + " standing by...", (pos + 1),0 });

メモリ使用量 30MB で、最初に datagridview に 3000 件のリクエスト全体を表示します。メモリ使用量 4XMB で 2XXX リクエストに到達すると、ステータス バーの番号とテキスト ボックスの更新がどんどん遅くなることがわかります。たとえば、2000 -> 2001 -> 2002 -> 2003 は 2000 -> 2003 になります。

アプリケーション ウィンドウを選択すると、UI 全体がフリーズすることさえありました。私のデータグリッドビューは、仮想モードでいくつかの行に固定されています。UIスレッドの問題だと思います。フリーズしたら、すべてのリクエストが完了してすべてがスムーズになるまで待つことができます。

何が起こっているのかについて何か考えはありますか?

4

1 に答える 1

0

最後に、私はそれがとても遅い理由を理解しました。私のような初心者は、この種のエラーを簡単に犯す可能性があります。スレッド中に使用した大量の begininvoke は影響しますが、UI スレッドをフリーズさせるほど重要ではありません。

重いワークロードは、主に、テキスト全体を毎回テキストボックスに割り当てる以下のコードによって購入されます

 textbox1.Text += "string"

次のコードで解決できます

textbox1.AppendText("string")
于 2012-10-31T07:47:46.807 に答える