2012-10-24 3 views
0

내 라이브러리에서 Windows Forms 또는 WPF 응용 프로그램에서 라이브러리를 사용하는지 여부에 관계없이 GUI 스레드에서 이벤트를 발생 시키려면 SynchronizationContext을 사용합니다. 내 클래스가 백그라운드 스레드에서 만들어진 경우 SynchronizationContext는 null이므로 이벤트를 직접 발생시킵니다. 이것은 내가 사용자 있었 것을 제외하고 잘 작동클라이언트 응용 프로그램에서만 SynchronizationContext를 사용하는 방법

private void RaisePlaybackStoppedEvent() 
    { 
     EventHandler handler = PlaybackStopped; 
     if (handler != null) 
     { 
      if (this.syncContext == null) 
      { 
       handler(this, EventArgs.Empty); 
      } 
      else 
      { 
       this.syncContext.Post(state => handler(this, EventArgs.Empty), null); 
      } 
     } 
    } 

는 ASP.NET 응용 프로그램에서 잘못보고 : 예를 들어

내가 SynchronizationContext가 null이 될 것이라고 가정했다
System.NullReferenceException was unhandled 
    Message=Object reference not set to an instance of an object. 
    Source=System.Web 
    StackTrace: 
     at System.Web.HttpApplication.ThreadContext.Enter(Boolean setImpersonationContext) 
     at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext) 
     at System.Web.AspNetSynchronizationContext.CallCallbackPossiblyUnderLock(SendOrPostCallback callback, Object state) 
     at System.Web.AspNetSynchronizationContext.CallCallback(SendOrPostCallback callback, Object state) 
     at System.Web.AspNetSynchronizationContext.Post(SendOrPostCallback callback, Object state) 

ASP.NET 웹 사이트에서. AsyncSynchronizationContext의 인스턴스 인 경우 SynchronizationContext를 사용하지 않는 방법이 필요합니다. System.Web에 대한 참조가없고 공개적으로 볼 수있는 유형이 아니기 때문에 이렇게하는 것이 좋을 것입니다.

내 질문은 내가 GUI (예 : WinForms, WPF, WinRT)를 사용하는 응용 프로그램에 있는지 확인하고 그 설정에서 SynchronizationContext 만 사용하는지 확인하는 가장 좋은 방법은 무엇입니까?

답변

1

이것은 ASP.NET의 버그처럼 보입니다. 해당 요청이 완료된 후 AspNetSynchronizationContext이 사용 된 경우 HttpApplication_context 필드를 지 웠습니다. 그런 다음이 null 참조를 ThreadContext 생성자에 전달하고 ThreadContext 클래스의 메서드가 필드 멤버에 액세스하려고 시도하여 NullReferenceException이 발생합니다.

4.5에서이 영역을 일부 변경 했으므로 이미 수정되었을 수 있습니다. 그렇지 않은 경우 reporting on Connect의 가치가있을 것입니다.

이 문제를 해결 현재 SynchronizationContext의 유형 이름을 검사 시도 할 수 :

var context = SynchronizationContext.Current; 
if (null != context && "AspNetSynchronizationContext" == context.GetType().Name) 
{ 
    context = null; 
} 

this.syncContext = context; 
+0

덕분에,이 오른쪽 라인을 따라 저를 가리키고 있습니다. 내 라이브러리가 오디오 재생 용이므로 요청이 거의 완료되었으므로 재생이 시작된 후 몇 분만에 이벤트가 실행될 수 있습니다. 왜 사람들이 웹 서버에서 오디오를 재생하려고하는지는 모르지만 그 중 일부는 사용자가하고있다). ASP.NET 응용 프로그램에 있는지 알 수있는 좋은 방법이 없으면 해결 방법을 사용해야합니다. –

+1

분명히 사용자가 뭔가 잘못하고있는 것처럼 들리지만, 시스템 관리자를 놀라게하려고하지 않는다면 누가 소리를들을 것입니까? 서버에 사운드 카드가 있습니까? 그들은 아마도 * 클라이언트 *에서 재생할 사운드를 원하고 그 차이를 이해하지 못합니다. 'Environment.UserInteractive'를 체크하고 예외를 던지거나'false'를 리턴하면 아무 것도하지 않을 수도 있습니다. –

+0

예, 이상한 요청입니다.하지만 수시로이를 시도하고 있습니다. 'Environment.UserInteractive'는 나에게도 유용 할 것으로 보인다. –

관련 문제