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,但它是无参数的。但是,您可以使用闭包来欺骗它:

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

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

于 2013-11-02T13:41:51.200 回答
0

建议:

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

WriteLineHandler 实例可以使用相同的方法。

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

编辑:

正如其他人所提到的,这不太可能是您的开销。不过,无需每次都为创建数组付费。

例子:

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