2012-10-07 3 views
1

에 대한 C#에서 멀티 스레딩을 사용하는 방법 I했습니다 기본적으로이 작업을 수행하는 응용 프로그램 :생성자

a)는 XML (내용의 많은 수를 구문 분석)을하고 클래스 객체에 드 직렬화/직렬화 데이터에 대한 수학적 연산을 수행합니다.

b) 여러 파일/디렉토리를 구문 분석하여 UI를 채 웁니다.

둘 다 독립적 인 작업입니다. 여기서 실행 시간이 길어 지므로 XML 파싱 및 연산을 수행하는 다른 클래스의 생성자를 호출하는 양식에서 멀티 스레딩을 사용하고 싶습니다. 그 방법을 안내해 주시겠습니까?

public partial class Form1: Form 
{ 
public Binarylist bList = new Binarylist(); //parses the XML and does multiple operations 
........ 
....... 
private Form1_Load(object sender, EventArgs e) 
{ 
........ //populates UI by parsing files & directories 
} 

여기 내 질문 - 나는 또한 주 스레드에서 병렬로를 Form1_Load을 실행할 수 있도록 내가 어떻게 Binarylist의 생성자를 멀티 스레딩합니까?

답변

3

배경 작업자를 사용하십시오.

작성된 이벤트를 Completed 이벤트에 전달하고이 이벤트를 formclass 필드에 지정하십시오.

해당하는 경우 나머지 양식 확인 bList == null을 확인하십시오.

+1

나는 당신을 얻지 못해 죄송합니다. 샘플 코드를 자세히 설명해 주시겠습니까? –

+1

전체 단어를 사용하실 수 있습니까? –

+0

그리고 당신은 이미 "Backgroundworker"를 찾았습니까? –

2

당신은 다음 단계를 수행하여 백그라운드 스레드에서 BinaryList를 생성 할 수 있습니다 : 그

private void getBinaryList() 
{ 
bList = new BinaryList(); 
} 
  • 양식 시작 로딩 아무것도하기 전에 새 스레드의 실행을 시작

    BinaryList 생성자에게 호출을 위해

    1. 이 방법을 만들기 그 외 :

      private Form_Load(object sender, EventArgs e) 
      { 
      Thread t = new Thread(new ThreadStart(getBinaryList)); 
      t.Start(); 
      
      
      // do your stuff 
      
      t.Join(); 
      //this ensures both threads complete before event execution finishes 
      } 
      

    두 작업이 모두 시간이 오래 걸린다면 UI 스레드를 잠그지 말고 앱이 응답하지 않게되어 배경 스레드와 UI를 모두 실행할 수 있습니다.

  • +0

    감사합니다. 이 오류는 "시작 인덱스가 0보다 작을 수 없습니다", 매개 변수 이름 = "StartIndex"입니다. 내 응용 프로그램을 실행하는 동안이 경고 (또는 오류)를 이해하지 못합니다. 도와 주실 수 있겠습니까? –

    +2

    이것은 스레딩과 관련이 없습니다. 그것은 당신의 논리 코드 어딘가에 있어야합니다. 하위 문자열 함수를 사용하고 있습니까? –

    1

    가장 간단한 해결책은 tasks을 사용하는 것입니다 완료 건설 기다린 후 당신에게 완전히 구성 객체를 줄 것이다 Task.Result 액세스

    public partial class Form1: Form 
    { 
        private readonly Task<Binarylist> bList = 
         Task.Factory.StartNew(() => new Binarylist()); 
    
        private Form1_Load(object sender, EventArgs e) 
        { 
         // Get the result of the task when needed 
         var constructedList = bList.Result; 
    
         // ... 
        } 
    } 
    

    . 아마도 Binarylist 클래스는 값 비싼 초기화 작업을 수행 할 수 있습니다.

    +0

    여기에 문제가 있습니다 => bList는 Binarylist로 생성되지 않고 Task 객체로 생성됩니다. 따라서 bList를 사용하여 클래스 멤버에 액세스 할 수 없으므로 오류가 발생합니다. –

    +0

    위의 코드에서 알 수 있듯이 - 작업의 Result 속성을 통해 실제 목록으로 이동합니다. 그런 다음 평소와 같이 반원들에게 접근 할 수 있습니다. –