나는 게으르다 (때로는 좋을 것이다) InvokeRequired을 먼저 검사하지 않고 콜백을 호출하여 WinForms UI를 업데이트하기 시작했다.먼저 InvokeRequired를 확인하지 않고 UI를 업데이트 할 때 성능 문제가 있습니까?
알고 있어야하는 성능 문제 또는 고려 사항이 있습니까?
private delegate void SetStatusEventHandler(string statusMessage);
private void SetStatus(string statusMessage)
{
Invoke((MethodInvoker) (() =>
{
resultLabel.Text = statusMessage;
}));
// - vs -
if (InvokeRequired)
{
SetStatusEventHandler cb = SetStatus;
Invoke(cb, statusMessage);
}
else
{
resultLabel.Text = statusMessage;
}
}
는 [편집] : 가장 좋아에서 호출하는 방법은 "호출"라는 시간의 대부분이라고한다은 해당 증속 넓은 간격으로 10 ~ 20 회 두 번째 말한다.
[업데이트] 내가 확장 메서드 클래스를 관리하는 방법을 알아내는 추측 다음 확장 메서드
public static class SmartInvoker
{
public static void InvokeHandler(this Control control, MethodInvoker del)
{
if (control.InvokeRequired)
{
control.Invoke(del);
return;
}
del();
}
}
...
private void SetStatus(string statusMessage)
{
this.InvokeHandler(() => resultLabel.Text = statusMessage);
}
으로 정착 내가 발굴해야 할 또 다른 주제는 . 당신의 도움
주셔서 감사합니다
나는 생각하지 않았다.나는 이벤트 큐를 포함하지 않고 * 호출 만한다는 인상을 받았다. –
@Marc, 나는 리플렉터 코드를 간단히 들여다 보았다. 그리고 invoke가 항상 이벤트 큐를 통과하는 것처럼 보인다. 그래도 깊은 수사는하지 않았다. – JaredPar
아니요, 동일한 Control.MarshaledInvoke 코드 경로를 통과합니다. 큐에 배치하지만 큐를 즉시 실행합니다. –