내 라이브러리에서 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 만 사용하는지 확인하는 가장 좋은 방법은 무엇입니까?
덕분에,이 오른쪽 라인을 따라 저를 가리키고 있습니다. 내 라이브러리가 오디오 재생 용이므로 요청이 거의 완료되었으므로 재생이 시작된 후 몇 분만에 이벤트가 실행될 수 있습니다. 왜 사람들이 웹 서버에서 오디오를 재생하려고하는지는 모르지만 그 중 일부는 사용자가하고있다). ASP.NET 응용 프로그램에 있는지 알 수있는 좋은 방법이 없으면 해결 방법을 사용해야합니다. –
분명히 사용자가 뭔가 잘못하고있는 것처럼 들리지만, 시스템 관리자를 놀라게하려고하지 않는다면 누가 소리를들을 것입니까? 서버에 사운드 카드가 있습니까? 그들은 아마도 * 클라이언트 *에서 재생할 사운드를 원하고 그 차이를 이해하지 못합니다. 'Environment.UserInteractive'를 체크하고 예외를 던지거나'false'를 리턴하면 아무 것도하지 않을 수도 있습니다. –
예, 이상한 요청입니다.하지만 수시로이를 시도하고 있습니다. 'Environment.UserInteractive'는 나에게도 유용 할 것으로 보인다. –