2016-09-23 14 views
1

, 난 멀티 스레드 프로그램에서 이벤트를 생성 다루는이 루틴을 사용했다 호출 : (여기서 나는 곳을 찾았지만 기억이 안나요) :C# 이벤트 창조 : 올립니다 대 C# 6 전

public static object Raise(this MulticastDelegate multicastDelegate, object sender, EventArgs e) 
    { 
     object retVal = null; 

     MulticastDelegate threadSafeMulticastDelegate = multicastDelegate; 
     if (threadSafeMulticastDelegate != null) 
     { 
      foreach (Delegate d in threadSafeMulticastDelegate.GetInvocationList()) 
      { 
       var synchronizeInvoke = d.Target as ISynchronizeInvoke; 
       if ((synchronizeInvoke != null) && synchronizeInvoke.InvokeRequired) 
        retVal = synchronizeInvoke.EndInvoke(synchronizeInvoke.BeginInvoke(d, new[] { sender, e })); 
       else 
        retVal = d.DynamicInvoke(sender, e); 
      } 
     } 
     return retVal; 
    } 
?

는 그래서 내가했던 일은, 나는 새가 같은 것을 사용하여 있었는지, C# 6으로 지금

Eventname.Raise (..., ...)

이었다 EVENTNAME .Invoke을 (.. .);

궁금한 점은 Raise()와는 다른 작품으로 Invocation으로 모든 이벤트 제작을 변경해야합니까, 아니면 같은 것입니까?

답변

3

처음에는 그 방법을 사용하지 않아야합니다. 그것은 너무 복잡합니다. 대신,이 같은 일이 더 좋았을 것 :

public static void Raise(this Delegate handler, object sender, EventArgs e) 
{ 
    if (handler != null) 
    { 
     handler.DynamicInvoke(sender, e); 
    } 
} 

당신이 이벤트 모금 코드를 변경해야하는지 여부에 관해서는, 나는 더 말할 것입니다. 당신이 죽일 시간이 많고 완벽하게 좋은 코드를 대체하는 전체 코드 기반을 지키고 싶지 않다면 말입니다.

무엇을 해야합니까해야합니까 현재 Raise() 방법을 수정합니다. 그리고 새로운 코드는 새로운 C# 6 방식으로 작성합니다 (즉, MyEvent?.DynamicInvoke(this, EventArgs.Empty)). 이는 추가 메서드 호출 없이는 위의 코드를 사용하여 MyEvent.Raise(this, EventArgs.Empty)과 동일합니다.

+0

의견을 보내 주셔서 감사합니다. Raise() 코드를 변경합니다. 도와 주셔서 감사합니다. – Tony