2011-10-20 4 views
2

내 목표는 다음과 같습니다.이 응용 프로그램은 많은 서식 파일 (Notepad ++ GUI와 비슷한)을 포함하는 양식 (MainForm)으로 구성됩니다. 각 탭은 UserControl 하위 항목 (UCDx)입니다. MainForm은 동일한 UCDx의 인스턴스를 포함하는 두 개 이상의 탭을 표시 할 수 있습니다. 목표는 UCDx가 DB 읽기/쓰기, 웹 서비스 메소드 호출과 같이 시간이 많이 소요되는 작업 또는 메소드 실행을 수행해야한다는 것입니다. 이러한 종류의 작업은 UI를 고정시키지 않기 위해 별도의 스레드에서 실행하고 싶습니다. 또한 정보 양식 (InfoForm)을 구현해야합니다. 즉, 현재 실행중인 스레드에 대한 정보와 일부 상호 작용 기능, 즉 너무 오래 실행되는 닫는 스레드가 표시됩니다. I 직면.NET WinForm 응용 프로그램에서 스레드 관리

주요 문제점은 : GUI와

  • 스레드 상호 - 쓰레드 즉 그리드에 표시되어야 데이터를 판독하고;
  • 스레드 상호 작용 관리 - InfoForm 구현시.

concurent/paralel 프로그래밍에서 저는 초보자입니다. 구현 방법에 대한 단서를 누군가 줄 수 있습니까?

답변

4

먼저 작업자 논리를 UI에서 분리합니다.

예를 들어, "데이터를 읽고 표시 할 필요가 스레드"를, 작은 조각으로 문제를 분리하려고하지 :

  1. 는 동기 처리 방법을 가지고 일반 클래스를 작성, 스레딩을 뒤얽힌. 다음과 같이 입력하십시오 :

    interface IServiceReader 
    { 
        Data GetDataFromService(IServiceInfo info); 
    } 
    
  2. 테스트하기. 단위 테스트를 만들거나 GUI 없이도 제대로 작동하는 것을 볼 수있는 작은 콘솔 앱을 만듭니다.

  3. 작업을 수행하기 위해 ServiceReader을 호출하지만 백그라운드 스레드에서 호출하고 완료되면 이벤트를 발생시키는 비동기 래퍼 클래스를 만듭니다.

    interface IAsyncServiceReader 
    { 
        void Start(IServiceInfo info); 
        event EventHandler<Data> DataReceived; 
    } 
    
  4. 다시 테스트하십시오. 이것은 GUI와 별도로 별도의 클래스 라이브러리 여야합니다.

  5. MVC 또는 유사한 패턴을 사용하여 모델 (비동기 서비스 판독기)에서 뷰 (탭)를 분리하십시오. 마지막으로

    class Controller 
    { 
        readonly ITabView _view; 
        readonly IAsyncServiceReader _model; 
        public Controller(ITabView view, IAsyncServiceReader model) 
        { 
          _view = view; _model = model; 
          AttachHandlers(); 
        } 
    
        void AttachHandlers() 
        { 
          view.UserRequestedLoading += (sender,info) => model.Start(info); 
          model.DataReceived += (sender,data) => view.DisplayData(data); 
        } 
    } 
    
  6. (즉, 백그라운드 스레드 호출이 오른쪽으로 파견 얻을 있는지 확인하십시오 : 이것은 당신이, 당신의 의견에서 상호 작용 이벤트를 발생 컨트롤러를 처리 한 후 컨트롤러 호출 모델의 적절한 조치하도록해야 의미 GUI) 스레드. 테스트를 단순화 뷰에서 모델을 분리

    class TabView : UserControl 
    { 
        void DisplayData(Data data) 
        { 
         if (this.InvokeRequired) 
         { 
          BeginInvoke(new Action<Data>(DisplayData), data); 
          return; 
         } 
    
         // otherwise, display the data in some way 
         dataGrid.DataSource = data; ... 
        } 
    } 
    

및 UI 나중에 변경이 단순히 탭보기가 호출이 필요한 경우 확인해야하는 것을 의미한다. 이것을 콘솔 앱 또는 Windows 서비스로 만들면 비즈니스 로직이 손상되지 않습니다.

+0

음 ... 좋은 출발점 ... 감사합니다. – DreadAngel

0

사용 백그라운드 스레드에서 호출하여 GUI에서 작업을 실행합니다. 멀티 스레딩에는 여러 가지 솔루션이 있습니다 : 작업, 백그라운드 작업자, 사용자 정의 스레드, 스레드 풀. 비동기 작업도 사용할 수 있습니다.

0

이 문제에 대한 많은 정보를 읽은 후에 (가장 중요한 의미는 Albahari threads docs) - 여기에 내 생각을 구현하는 첫 번째 시도가 있습니다 - gCode에서 svn을 통해 가져옵니다. 많은 의견을 남겨주세요. 의견 수렴과 의견이 필요합니다. 고맙습니다.

관련 문제