Silverlight 크로스 스 레 드 사용 에 대한 상세 한 설명

새 SL4 프로그램,MainPage 에 코드 추가:

배경 코드:

private void btnThread1_Click(object sender, RoutedEventArgs e)
        {
            new Thread(() =>
            {
                MessageBox.Show("Hello World");
            }).Start();
        }
프로그램 을 실행 하고 단 추 를 누 르 면 아래 의 이상 을 얻 을 수 있 습 니 다.
clip_image002
이 문제 의 원인 은 매우 간단 하 다.한 스 레 드 가 다른 스 레 드 방법 으로 이 이상 을 해결 하려 고 시도 하 는 방식 은 매우 간단 하 다.
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();

좋은 웹페이지 즐겨찾기