나는 ValueGenerated라는 이름의 이벤트가 있습니다. ValueGenerated 값을 생성하고 발생시키는 코드는 스레드에서 실행되며이 이벤트를받는 메소드는 form.control (즉 양식)에 있습니다. UI 스레드가 다른 스레드가 UI를 변경하는 것을 허용하지 않기 때문에 나는 이벤트 세대에서 다음 코드를 작성 :이벤트 타겟을 얻는 방법
if (ValueGenerated.Target is System.windows.form.control)
{
Control targetForm = ValueGenerated.Target as control;
targetForm.Invoke(ValueChanged,new object[]{this,args});
}
하지만 이벤트가 하나 이상의 메도에 의해 등록 된 경우 무슨 생각합니다. 예를 들어, 두 개 또는 세 개의 목적지. 왜 이벤트와 델리게이트 클래스에는 마지막 메소드의 인스턴스 객체를 반환하는 Target 속성 만 있습니까? 우리는 항상 마지막 것만 필요합니까?
GetInvocationList를 사용하여 모든 가입 된 대리인을 가져옵니다. 그런 다음 모든 대상을 검사하여 대상이 무엇인지 확인할 수 있습니다. –
누가 다른 스레드에서 UI를 업데이트 할 수 없다고합니까? – Jim
이벤트의 실제 백업 저장소는 MulticastDelegate입니다. 여러 명의 가입자를 허용하여 대의원을 확대합니다. 잠재적 스레딩 버그를 숨기는 것은 매우 나쁜 생각입니다. 특히 Invoke()는 교착 상태가 발생하기 쉽기 때문에 이벤트 핸들러 메서드에 반환 값이 없기 때문에 절대로 필요하지 않습니다. 특히 UI에 영향을주는 이벤트는 작업자 스레드가 계속 실행 중이지만 사용자가 창을 닫으면 잘못 될 수 있습니다. 하지 마. –