Silverlight 크로스 스 레 드 사용 에 대한 상세 한 설명
배경 코드:
private void btnThread1_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
MessageBox.Show("Hello World");
}).Start();
}
프로그램 을 실행 하고 단 추 를 누 르 면 아래 의 이상 을 얻 을 수 있 습 니 다.이 문제 의 원인 은 매우 간단 하 다.한 스 레 드 가 다른 스 레 드 방법 으로 이 이상 을 해결 하려 고 시도 하 는 방식 은 매우 간단 하 다.
1:Dependency Object.dispatcher.Begin Invoke 방법 사용:
private void btnThread1_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
this.Dispatcher.BeginInvoke(() =>
{
MessageBox.Show("Hello World");
});
}).Start();
}
2:Synchronization Context 대상
private void btnThread1_Click(object sender, RoutedEventArgs e)
{
SynchronizationContext context = SynchronizationContext.Current;
new Thread(() =>
{
context.Post((state) =>
{
MessageBox.Show("Hello World");
}, null);
}).Start();
}
을 사용 하지만 둘 다 결함 이 있 습 니 다.예 를 들 어 다 중 스 레 드 의 다 중 스 레 드 가 있다 고 가정 합 니 다.
private void btnThread1_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
SynchronizationContext context = SynchronizationContext.Current;
new Thread(() =>
{
context.Post((state) =>
{
MessageBox.Show("Hello World");
}, null);
}).Start();
}).Start();
}
여기 context 가 저장 되 어 있 지만 context 는 UI 스 레 드 의 Synchronization Context 가 아니 기 때문에 이상 이 발생 합 니 다.그래서 세 번 째 방안 을 제시 했다.1:새로운 정적 클래스 UISynchronizationContext,코드 는 다음 과 같다.
/// <summary>
/// UI SynchronizationContext
/// </summary>
public static class UISynchronizationContext
{
public static SynchronizationContext Context { get; set; }
}
앱.Xaml.cs 코드 의 구조 함 수 를 수정 하고 앱 을 구성 할 때 설정
UISynchronizationContext.Context = SynchronizationContext.Current;
public App()
{
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException;
// UI
UISynchronizationContext.Context = SynchronizationContext.Current;
InitializeComponent();
}
을 사용 할 때 필요 하 다.
private void btnThread1_Click(object sender, RoutedEventArgs e)
{
new Thread(() =>
{
new Thread(() =>
{
UISynchronizationContext.Context.Post((state) =>
{
MessageBox.Show("Hello World");
}, null);
}).Start();
}).Start();
}
사실은 Silverlight 는 비슷 한 기능 의 종 류 를 제공 했다.그것 이 바로 System.Windows.Deployment 입 니 다.위의 코드 를 다음 과 같이 수정 할 수 있 습 니 다.
new Thread(() =>
{
new Thread(() =>
{
//UISynchronizationContext.Context.Post((state) =>
// {
// MessageBox.Show("Hello World");
// }, null);
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
MessageBox.Show("Hello World");
});
}).Start();
}).Start();
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Silverlight 2 시리즈 (20): Silverlight 에서 HTML DOM 과 어떻게 상호작용 하 는 지 (하)Silverlight 2 Beta 1 버 전 은 런 타임 이 든 Tools 든 프레임 워 크 언어 Visual Basic, Visual C \ #, IronRuby, Ironpython, JSON, Web Servi...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.