代表的性能问题

时间:2013-11-02 09:41:03

标签: c#

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 });此行需要很长时间才能执行。任何人都可以帮助我提高绩效。

2 个答案:

答案 0 :(得分:2)

this.Invoke这里不只是委托调用:它通过消息循环向UI线程发送消息。这有开销,所以:尝试批处理工作 - 所以你不经常调用它,但每个都有更多“东西”。

此处还有一些代理类型的开销 - 只有少数显式检查快速/类型调用 - MethodInvoker是一个,iirc,但这是无参数的。但是你可以使用一个闭包来欺骗它:

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

(注意EventHandler也是特殊的;所有其他委托类型将使用DynamicInvoke,这要慢得多 - 但同样:这里的主要开销是UI消息循环)

答案 1 :(得分:0)

建议:

每次都创建两个对象。您可以尝试保留其中一个或两个。例如,对象数组是一个明显的竞争者。只需在方法中声明一个静态的,然后在调用时将第一个元素替换/设置为消息的新值。

可能会对WriteLineHandler实例使用相同的方法。

EDIT2: 对不起,第一次搞砸了这个例子。

编辑:

正如其他人所提到的,这不太可能是你的开销。不过,每次创建阵列都没有必要付费。

示例:

try {
    static object[] messageAsArray = { "dummy" };
    messageAsArray[0] = message;
    this.Invoke(new WriteLineHandler(printMessage), messageAsArray);
}
    catch (Exception)
{
            }