C# 代表的绩效问题

C# 代表的绩效问题,c#,C#,this.Invoke(新WriteLineHandler(printMessage),新对象[]{message})执行这一行需要很多时间。有人能帮我提高性能吗。建议: 每次创建两个对象。你可以试着保留其中一个或两个。例如,对象数组就是一个明显的竞争者。只需在方法中声明一个静态元素,然后在调用时将第一个元素替换/设置为message的新值 WriteLineHandler实例也可以使用相同的方法 编辑2: 对不起,第一次把这个例子搞砸了 编辑: 正如其他人所提到的,这不太可能是您的开销。不过,

this.Invoke(新WriteLineHandler(printMessage),新对象[]{message})执行这一行需要很多时间。有人能帮我提高性能吗。

建议:

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

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

编辑2: 对不起,第一次把这个例子搞砸了

编辑:

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

例如:

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
这里不仅仅是委托调用:它通过消息循环向UI线程发送消息。这会带来开销,所以:试着把要做的工作分批完成——这样你就不那么频繁地称之为工作了,但每个工作中都有更多的“东西”

委托类型也有一些开销-只有少数被显式地检查为快速/类型化调用-
MethodInvoker
是一个,iirc,但这是无参数的。但是,您可以使用闭包来欺骗它:

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

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

它花费了多少时间?与您的期望或其他代码相比,我有一个执行10000次的API,它花费了2个小时的时间。如果我删除此行this.Invoke(新WriteLineHandler(printMessage),新对象[]{message});它仅在11分钟内执行。所以有很多变化,但我不知道如何最小化代码。请帮助我了解您的
Invoke
方法是什么?可以直接调用方法,
printMessage(message)?也许你真正的问题是一个意外的无限递归?实际上我有两个线程要执行。两个线程同时执行,所以我想在当前线程中打印消息。所以我想,
Invoke
就是这样。我们可以使用static关键字进行delegates吗?固定示例:)抱歉,我放进去的时候有点晚。@user2862430问题不是“如何做”-而是“多久做一次”。100000个单独的呼叫,每个呼叫有一个值,比1000个呼叫(每个呼叫有100个值)要昂贵得多。根据问题中的代码,
Control.Invoke
(但可能使用
MethodInvoker
来帮助一点),它的工作状态很好…但是性能MethodInvoker方法=()=>{…}没有任何改进;this.Invoke(方法,null);这条线很好用。。我的意思是它的执行非常完美……但问题是,还有什么可以替代它的吗
MethodInvoker method = () => { … };
this.Invoke(method, null);