티스토리 뷰

반응형

기존

void Custom(int a){
  if (InvokeRequired)
  {
      Invoke(new MethodInvoker(() => Custom(a)));
  }
  else
  {
  	...
  }
}

이런식의 Invoke 처리 코드는 질리도록 봤을 것이다.

문제는 위의 코드 반복이 심하다는 것. 메서드를 만들지 않으면 처리 코드까지 반복이 된다.

간단히 사용해보자.

 

대체

        public delegate void InvokeIfRequiredDelegate<T>(T obj) where T : ISynchronizeInvoke;
        public static void InvokeIfRequired<T>(this T obj, InvokeIfRequiredDelegate<T> action) where T : ISynchronizeInvoke
        {
            if (obj.InvokeRequired)
            {
                obj.Invoke(action, new object[] { obj });
            }
            else
            {
                action(obj);
            }
        }
        public static TOut InvokeIfRequired<TIn, TOut>(this TIn obj, Func<TIn, TOut> func)
            where TIn : ISynchronizeInvoke
        {
            return obj.InvokeRequired
                ? (TOut)obj.Invoke(func, new object[] { obj })
                : func(obj);
        }

위 메서드를 정적 클래스에 등록해서 확장 메서드로 등록한다.

다음과 같이 사용할 수 있다.

InvokeIfRequired(o=>{
  o.Text = "ABC";
}); // this.InvokeIfRequired 와 같음

button.InvokeIfRequired(o => {
  o.Text = "ABC";
});

String t = label.InvokeIfRequired(o => {
  o.Text = "ABC";
  return o.Text;
});

 

반응형
댓글
댓글쓰기 폼