2011-02-09 4 views
2

이 코드를 컴파일하면 오류가 발생하고 개체 참조가 null로 설정되며 오류 위치는 Dowork에 있습니다. argumenttest.valueone = 8;C#, 백그라운드 작업자 클래스

public partial class Form1 : Form 
{ 
    BackgroundWorker bgw1 = new BackgroundWorker(); 
    public Form1() 
    { 
     InitializeComponent(); 
     // bgw1.RunWorkerAsync(test1); 

     test test1 = new test 
     { 
      valueone = 5, 
      valuetwo = 10 
     }; 
     bgw1.RunWorkerAsync(test1); 
    } 

    class test 
    { 

     public int valueone { get; set; } 
     public int valuetwo { get; set; } 
    } 

    private void bgw1_DoWork(Object sender, DoWorkEventArgs e) 
    { 
     test argumenttest = e.Argument as test; 
     Thread.Sleep(10); 

     argumenttest.valueone = 8; 
     argumenttest.valuetwo = 10; 

     e.Result = argumenttest; 
    } 

    private void bgw1_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e) 
    { 
     test test12 = e.Result as test; 
     button1.Text = test12.valueone.ToString();// +test.valuetwo.ToString(); 
     //this.Text = test.valueone.ToString() + " "+ test.valuetwo.ToString(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

     bgw1.DoWork += bgw1_DoWork; 
     bgw1.RunWorkerCompleted += bgw1_RunWorkerCompleted; 
     //bgw1.RunWorkerAsync(test); 

    } 
} 
+1

코드에서 더 자주 단어 테스트를 사용 했습니까? ;) – thumbmunkeys

+0

@ Henk HolterMan : 저는이 배경 작업자 (스레딩)를 처음 접했고 실용적인 작업을하기 전에 연습으로 구현했습니다. – safi

+0

@ pivotnig : 나는 쉽게 생각했다. ( – safi

답변

4

argumenttestnull으로 끝나는 두 가지 방법이 있습니다

  1. argumenttestRunWorkerAsyncnull로 보내졌다가.

  2. e.Argument as test;e.Argumenttest을 준수하지 뭔가이며, as 운영자는 그것을 null한다.

위의 코드 예제가 상당히 어수선하기 때문에 어느 것이 보이기가 어렵습니다.

편집

당신은 decyclone이 그것을 편집으로 코드가 정확히 것을 확인 할 수 있나요? 그럴 경우, 괜찮아 보이고, 내가 볼 수있는 한 멀리 일해야했습니다.

DoWork 메서드의 첫 번째 줄에 중단 점을 설정하면 디버그 할 때 e.Argument 위로 마우스를 가져 가면 1. 또는 2.가 문제인지 쉽게 확인할 수 있습니다. 내가 볼

+0

@ Oyvind Knobloch-Brathen : 맞습니다. Mr. and thanks 감사합니다. 대답 번호는 1입니다. :) runworkerasync()에 객체를 사용 가능하게하지 않고도 작업 수행에서 argumenttest를 수행했습니다. – safi

+0

나는 2의 경우에 내기를 걸었습니다. –

+0

test t = new test(); bgw1.RunWorkerAsync (t); 이것은 테스트 객체가 누락되어 runworker async()에서 null을 전달할 때 현재 고정되어있는 방식입니다. – safi

1

하나의 문제는 노동자를 실행하기 전에 이벤트 핸들러를 설정하지 않는 것이, 그래서이 두 라인은

bgw1.DoWork += bgw1_DoWork; 
    bgw1.RunWorkerCompleted += bgw1_RunWorkerCompleted; 

bgw1.RunWorkerAsync(test1); 
1

당신이해야 전에 호출 할 수있다 Form을로드하거나 RunWorkerAsync를 호출하기 전에 DoWork 및 RunCompleted를 등록하십시오. 위의 라인

bgw1.DoWork += bgw1_DoWork; 
bgw1.RunWorkerCompleted += bgw1_RunWorkerCompleted; 

이동 버튼을 클릭 이벤트 핸들러에서의 Form_Load합니다.

bgw1.RunWorkerAsync(test1);을 폼로드 메서드에서 단추 클릭 핸들러로 이동하십시오.

관련 문제