2

C# winforms アプリケーションを作成しました。今、私はテキストボックスで出力を更新する膨大な数のクランチ関数を呼び出すボタンがたくさんあるフォームを持っています。テキストボックス内のテキストを更新する関数にデリゲートを渡す textbox.begininvoke() メソッドを呼び出しますが、テキストが巨大な場合、キャンセルボタンをクリックできないため、フォームは応答しません。フォーム全体の応答性を維持し、更新も継続する方法はありませんか。データが来るときにユーザーに表示する必要があります。すべてをバッファリングして最後に表示することはできません。また、独自のバッファを実装し、特定の間隔でデータを表示しようとしましたが、これは少量のテキストにはうまく機能しますが、大量のテキストでは UI が応答しません。助けはありますか?ありがとう

いくつかの混乱が生じているため、質問を更新します

  • 別のスレッドで数値処理関数を呼び出しました。
  • その数値計算関数は、データが到着してテキストボックスを更新するたびに control.begininvoke 関数を呼び出します
  • MY UI が表示され、出力が表示されますが、データが膨大な場合、UI は表示されますが、他のアクティビティを実行できません。
4

3 に答える 3

8

BeginInvoke (または Invoke) を呼び出しても、数処理関数が UI スレッド以外の別のスレッドで実行されていない限り、何も得られません。

次のコードを検討してください。

private void HardWork(object state)
{
    for (int i = 0; i < 10; i++)
    {
        Thread.Sleep(500);
        SetText(i.ToString());
    }
}

private void SetText(string text)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new Action<string>(SetText), text);
    }
    else
    {
        textBox1.Text = text;
    }
}
private void Button_Click(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(HardWork);            
}

Button_ClickメソッドHardWorkは、別のスレッドでメソッドの実行を開始します。HardWork は何らかの処理を行い (呼び出しによってシミュレートされThread.Sleepます)、メソッドを呼び出して進行状況を表示します。このメソッド内で、UI スレッド上にいるかどうかを確認する必要があります。Invokeそうでない場合は、 (または)を使用して同じメソッドを呼び出し、BeginInvokeUI スレッドで強制的に実行させます。

更新: 数値演算メソッドから出力されるデータの量が非常に多い場合、これはもちろん UI の応答性に悪影響を及ぼす可能性があります。たとえば、スレッド化されたメソッドに大量のテキストを蓄積し、更新のたびにそのテキストを発行すると、最後の更新以降に変更されたものを単に発行するよりも遅くなります。同じことがテキスト ボックスにも当てはまります。新しいテキストだけで TextBox.AppendText を呼び出すと、TextBox.Text プロパティを繰り返し割り当てるよりも高速になります。

あなたのコードが実際に何をするかを見ていないので、特定の問題を解決する方法についてより詳細なアイデアを提供することは困難です.

于 2009-05-19T06:25:42.183 に答える
7

あなたはそれを逆手に取りました。

BeginInvoke は、UI を更新するために使用する必要があるものです。あなたが信じているように、それは新しいスレッドを生成しません。

BeginInvoke は単に「コントロールが最初に作成されたスレッド内で次を実行する」、つまり UI スレッドです。

したがって、BeginInvoke は、更新を UI にポストバックするために数値計算スレッドで使用する必要があるものです。

お役に立てれば

于 2009-05-19T06:21:36.447 に答える
-1

テキスト ボックスを更新する関数を少しずつ実行し、更新ごとにDoEventsを呼び出します。つまり、紐をバラバラにして……

update piece 1
DoEvents
update piece 2
DoEvents
...
update piece n
于 2009-05-19T06:24:12.607 に答える