Para cada solución abajo I ejecutar un 131072 (128 * 1024) iteraciones (en un hilo separado). El ayudante de interpretación VS2010 dan estos resultados:
- sólo lectura MethodInvoker: 5.664,53 (+ 0%)
- Nueva MethodInvoker: 5.828,31 (+ 2,89%)
- función de conversión en MethodInvoker: 5.857,07 (3,40 %)
- sólo lectura Acción: 6.467,33 (+ 14,17%)
- nueva Acción: 6.829,07 (+ 20,56%)
llamada a una nueva Acción en cada iteración
private void SetVisibleByNewAction()
{
if (InvokeRequired)
{
Invoke(new Action(SetVisibleByNewAction));
}
else
{
Visible = true;
}
}
llamada a una, construir en el constructor, de sólo lectura Acción en cada iteración
// private readonly Action _actionSetVisibleByAction
// _actionSetVisibleByAction= SetVisibleByAction;
private void SetVisibleByAction()
{
if (InvokeRequired)
{
Invoke(_actionSetVisibleByAction);
}
else
{
Visible = true;
}
}
llamada a una nueva MethodInvoker en cada iteración.
private void SetVisibleByNewMethodInvoker()
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(SetVisibleByNewMethodInvoker));
}
else
{
Visible = true;
}
}
llamada a una de sólo lectura, la construcción en el constructor, MethodInvoker en cada iteración
// private readonly MethodInvoker _methodInvokerSetVisibleByMethodInvoker
// _methodInvokerSetVisibleByMethodInvoker = SetVisibleByMethodInvoker;
private void SetVisibleByMethodInvoker()
{
if (InvokeRequired)
{
Invoke(_methodInvokerSetVisibleByMethodInvoker);
}
else
{
Visible = true;
}
}
de llamadas al elenco función en MethodInvoker en cada iteración
private void SetVisibleByDelegate()
{
if (InvokeRequired)
{
Invoke((MethodInvoker) SetVisibleByDelegate);
}
else
{
Visible = true;
}
}
Ejemplo de llamada para la solución "Nueva acción":
private void ButtonNewActionOnClick(object sender, EventArgs e)
{
new Thread(TestNewAction).Start();
}
private void TestNewAction()
{
var watch = Stopwatch.StartNew();
for (var i = 0; i < COUNT; i++)
{
SetVisibleByNewAction();
}
watch.Stop();
Append("New Action: " + watch.ElapsedMilliseconds + "ms");
}
Mira esto, así http://mark-dot-net.blogspot.com.uy/2014/07/six-ways-to-initiate-tasks-on-another.html –