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