1
public void printMessage(string message)
{
    try
    {
        if (this.InvokeRequired)
        {
            try
            {
                this.Invoke(new WriteLineHandler(printMessage), new object[] { message });
            }
            catch (Exception)
            {
            }
        }
        else
        {
            if (message.Length > 0)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append(DateTime.Now.ToString("G"));
                sb.Append(": ");
                sb.Append(message);
                sb.Append("\n");
                sb.Append(richTextBox.Text);
                richTextBox.Text = sb.ToString();
            }
        }
    }
    catch (Exception)
    {
    }
}

this.Invoke(new WriteLineHandler(printMessage), new object[] { message });この行は実行に時間がかかります。パフォーマンスを向上させるために誰かが私を助けてくれますか?

4

2 に答える 2

2

this.Invokeここではデリゲートの呼び出しだけではありません。メッセージ ループを介して UI スレッドにメッセージを送信しています。これにはオーバーヘッドがあるため、実行する作業をバッチ処理してみてください。そのため、呼び出す頻度は低くなりますが、それぞれの「もの」が増えます。

ここでは、デリゲート型のオーバーヘッドもあります。高速/型指定された呼び出しについて明示的にチェックされるのはごくわずかですMethodInvoker。iirc は 1 つですが、パラメーターはありません。ただし、クロージャーを使用してこれを偽装できます。

MethodInvoker method = () => { … };
this.Invoke(method, null);

(注記EventHandlerも特殊なケースです。他のすべてのデリゲート タイプは を使用しますがDynamicInvoke、これははるかに低速です。ただし、ここでも主なオーバーヘッドは UI メッセージ ループです)

于 2013-11-02T13:41:51.200 に答える
0

提案:

毎回 2 つのオブジェクトを作成します。どちらかまたは両方を保持しようとすることができます。たとえば、オブジェクトの配列は明らかな候補です。メソッドで静的なものを宣言し、呼び出し時に最初の要素をメッセージの新しい値に置き換える/設定するだけです。

WriteLineHandler インスタンスにも同じアプローチを使用できます。

EDIT2: 申し訳ありませんが、初めて例を台無しにしました。

編集:

他の人が述べたように、これはあなたのオーバーヘッドにはなりそうにありません。それでも、アレイを作成するたびに料金を支払う必要はありません。

例:

try {
    static object[] messageAsArray = { "dummy" };
    messageAsArray[0] = message;
    this.Invoke(new WriteLineHandler(printMessage), messageAsArray);
}
    catch (Exception)
{
            }
于 2013-11-02T09:47:11.113 に答える