Silverlight 멀티스레드 기능(상)

5617 단어 silverlight
인포큐
다선정에 대해 사실 지금까지 많은 오류가 존재해 왔다. 예를 들어 다임무와 다선정은 혼동되기 쉽고 다선정도 당연히 병행으로 여겨지는 등이다.사실은 다임무 ≠다선정, 단임무 ≠단선정, 다선정이 반드시 병행되지 않고 다선정과 성능이 선형적인 관계가 되지 않는다는 등이다. 그 중에서 이치는 여기서 상세하게 설명하지 않는다.필자는 Silverlight 다중 스레드의 주요 역할은 성능을 향상시키는 것이 아니라 사용자 체험에 있다고 생각한다. 그 근본적인 목적은 사용자 체험에서의 응답 속도를 해결하고 단일 스레드가 가져오는 막힘 문제를 줄이는 것이다.한 가지 적절한 예로 단선정과 다선정의 차이를 형용한다. 단선정은 마치 서비스 창구가 하나밖에 없는 매표소와 같다. 사람들이 줄을 서서 표를 살 때 모두 단선정으로 처리되고 위치를 빼앗을 수 없다. 그러면 앞에 한 사람이 장시간 기다리면 뒤에 있는 사람이 응답을 받지 못한다. 그러면 단선정이 막힌다.그러나 다선정은 마치 여러 개의 서비스 창구가 표를 팔러 가는 것과 같아서 차표 매매와 대기 상황이 많이 좋아질 것이다(물론 이 예가 공중화장실로 바뀌면 사용자 체험에 더욱 중요하다).
이번에는 Silverlight의 다중 스레드 능력을 살펴보겠습니다. 사실 Silverlight의 다중 스레드는 두 가지 측면에 나타난다.
첫 번째는 UI 스레드와 백엔드 작업 스레드를 분리하여 UI 스레드가 사용자의 조작에 더욱 잘 응답할 수 있도록 하는 것이다. 백엔드 스레드가 처리된 후에 비동기적인 방식으로 처리 결과를 백엔드로 되돌려 전시할 수 있다.필자는 이것이 다중 스레드가 Silverlight에서 가장 주요한 역할이라고 생각한다(많은 전통적인 웹 응용 개발자들이 Silverlight를 처음 접했을 때 이런 백엔드 스레드의 비동기적인 조작에 적응하지 못한다).
두 번째는 백엔드 작업에 대한 다중 루틴 지원이다. 예를 들어 클라이언트 백엔드에서 병렬 연산이 필요할 때 여러 개의 루틴을 발동하여 이 연산을 완성할 수 있다.지난번 에서 저는 여러분께 Silverlight의 기초 라이브러리를 소개했는데 그 중에서 다선정과 관련된 클래스를 포함합니다.
UI 스레드는 Silverlight와 사용자가 상호작용하는 스레드입니다. Silverlight에서 UI 스레드는 단일합니다. 그 중에서 UI 컨트롤 클래스와 데이터 연결에 사용되는 View 모델 클래스를 불러옵니다(View 모델이란 무엇입니까? 바로 View 층만을 위한 실체입니다. 펼치면 길어집니다. 여기서 멈추세요!)백그라운드 스레드에서는 이러한 UI 스레드의 데이터 및 컨트롤 객체에 직접 액세스할 수 없습니다.하지만 걱정하지 마십시오. Silverlight와 WPF의 스레드 모델은 자바 스윙에서 EDT(Event Dispatch Thread)와 같은 안전한 이벤트 분배 스레드 모델을 사용하여 UI 스레드와 다른 백엔드 스레드의 데이터 상호작용 문제를 해결합니다.Silverlight(WPF)의 컨트롤 클래스 라이브러리 System.Windows의 모든 클래스는 Dependency Object 기본 클래스를 계승합니다. Dependency Object 클래스는 Silverlight(WPF)의 가장 기초적인 의존성 속성 서비스(의존성 속성은 무엇입니까? 간단하게 말하면 대상 속성 값은 다른 계산 값에 의존하는 방식입니다. 이런 방식은 데이터 귀속, 애니메이션, 재사용 양식에 타당성을 제공할 뿐만 아니라 여기서 더 이상 전개하지 않습니다).또한 UI 스레드와 백엔드 스레드의 데이터 상호 방문 채널을 열었다. Dependency Object에서 매우 중요한 속성인 Dispatcher가 있는데 백엔드 스레드는 발기자(일반적으로 UI 컨트롤)의 Dispatcher를 호출하여 상호작용을 할 수 있다. 백엔드 스레드는 다음과 같은 방식으로 UI 스레드의 대상을 직접 조작할 수 있다.
_UISender.Dispatcher.BeginInvoke(() => 
{ 
    //      UI      ,          UI      
}

위의 ()=>는 Lamda 표현식에서 들어오지 않은 의뢰 방법에 대한 간략한 형식으로 들어오는 파라미터가 괄호에 열거되어 있다면, 물론 Action을 사용하여 다른 곳으로 다시 불러와서 의뢰 과정을 실현할 수 있습니다.
Silverlight 는 UI 스레드 생성 및 백그라운드 스레드 액세스를 쉽게 수행할 수 있도록 백그라운드 스레드를 만드는 다양한 방법을 제공합니다.
  • 일반적인 시스템 기반Threading.Thread 클래스 생성 백그라운드 스레드
  • Thread 클래스는 가장 기초적인 다중 스레드 클래스로, 다음과 같은 독립적으로 실행되는 스레드를 만들 수 있습니다.
    Threadthread = new Thread(obj.functionName); 
    thread.IsBackground = true; 
    thread.Start();

    그러나 Thread는 라인에 대한 감시, 소각, 리셋이 비교적 복잡하기 때문에 필자는 Thread를 사용하여 간단하고 리셋이 필요 없는 임무를 완성한다.
  • System 기반Windows.Threading.DispatchTimer 클래스 생성 백그라운드 타이머 스레드
  • DispatchTimer 클래스는 Silverlight(WPF)에 등장한 백엔드 스레드 타이머로 원래 시스템보다 낫다.Threading.Timer의 차이점은 DispatchTimer가 백엔드 스레드에서 독립적으로 실행되고 Timer는 여전히 UI 스레드에서 실행되며, 정해진 시간에 UI 스레드 제어권을 얻을 뿐이다.DispatchTimer는 정해진 시간에 실행되는 작업에만 적합하며 필요에 따라 대기 시간을 설정할 수 있습니다. 이 작업은 다음과 같습니다.
    DispatcherTimer dt = new DispatcherTimer(); 
    dt.Interval = new TimeSpan(0, 0, 0, 0, 10); 
    dt.Tick += new EventHandler(dt_Tick); 
    dt.Start(); 
    void dt_Tick(object sender, EventArgs e) 
    { 
        //          
        //      UI       
        //            dt.Stop(); 
    }

    Dispatcher Timer는 사실 Story Board를 제외하고 애니메이션을 실현할 수 있는 중요한 구성 요소이다. 당연히 Dispatcher Timer를 이용하여 과도한 백엔드 라인을 구축해야 한다. 그렇지 않으면 CPU 스케줄링 비용이 증가하여 오히려 효율에 영향을 줄 수 있다!(지출 스케줄링은 다음 부분에서 설명합니다.)
  • System 기반ComponentModel.BackgroundWorker 클래스에서 백그라운드 스레드를 쉽게 만들 수 있음
  • 마이크로소프트는 WinForm 구조에서 BackgroundWorker 클래스를 도입했는데 이 클래스 안에 많은 라인 포장 방법을 구축하여 라인 상호작용의 인코딩 과정을 크게 간소화시켰다.Silverlight(WPF)에서도 BackgroundWorker 클래스를 사용하여 다음과 같은 방법으로 백그라운드 스레드를 쉽게 만들 수 있습니다.
    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler((object, doworkeventarg) =>obj.function()); 
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
    if(!bw.IsBusy) bw.RunWorkerAsync(); 
    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
        //          
    }

    BackgroundWorker도 ReportProgress(intpercentProgress) 방법을 통해 다른 라인에 진도 완성 상황을 보고할 수 있다. 물론 이것은 양적 진도를 측정할 수 있는 백엔드 작업 라인에만 적합하다. 그 실현은 다음과 같다.
    //    obj.function()  
    … 
    obj.ReportProgress(i); 
    … 
    // UI            
    bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
    void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
        //            
    }
  • System 기반Threading.ThreadPool 정적 클래스 생성 백그라운드 스레드
  • 모든 다중 스레드 솔루션 중에서 ThreadPool 스레드 풀은 필자가 가장 자주 사용하는 기술이다.그 장점은 쉽게 제어하고 비용을 줄이는 데 있다. 온라인 스레드 탱크의 스레드는 하나의 임무를 완수했다고 해서 사라지지 않고 다른 임무를 계속 집행하여 스레드의 창설과 소각 비용을 크게 줄인다.ThreadPool의 QueueUserWorkItem 메서드는 백그라운드 스레드 대기열에 모든 처리 함수를 배치하여 실행할 수 있으며 쉽게 만들 수 있습니다.
    obj.OnEvent += (object, eventarg) => Dispatcher.BeginInvoke(UI_OnEvent); 
    ThreadPool.QueueUserWorkItem(state =>obj.function(), stat); 
    voidUI_OnEvent() 
    { 
        //               
    }

    백엔드 스레드 대상obj에서 리셋 이벤트를 마음대로 정의하고 Dispatcher를 통과할 수 있습니다.BeginInvoke 방법으로 UI 스레드에 대한 위임을 알립니다.이런 방식은 비교적 간단하고 실용적이다.물론 ThreadPool류는 Register WaitFor Single Object 방법을 제공하여 Thread 타이머의 기능을 실현했다. ThreadPool은 기업 응용에서 비교적 자주 사용하는 다중 루틴 실현류라고 할 수 있다.
    이로써 Silverlight가 자주 사용하는 다중 루틴 실현 방식을 소개했지만 필자는 Silverlight의 다중 루틴은 사용자 체험을 향상시키기 위한 것이라고 강조했다.사실 Silverlight 개발이 둘러싼 관건은 사용자 체험이다. 사용자 체험이 현대 상업 응용 개발에서 차지하는 지위는 매우 중요하다.본 주제의 하반부에서 필자는 실버라이트의 다중 스레드 성능과 다른 웹 개발 기술과의 성능을 실례를 통해 설명하고자 한다.

    좋은 웹페이지 즐겨찾기