2014-06-05 3 views
0

기본 폼의 목록 상자에 테스트 스크립트 목록이 들어있는 GUI가 있습니다. 목록 상자에서 선택한 항목에 따라 BackgroundWorker 다른 스크립트를 실행하고 싶습니다. 나는이 작업을 수행하려고 할 때 크로스 스레드 작업을 시도하고 있기 때문에 조건부 BackgroundWorker 시나리오

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    if(listbox.SelectedItem.ToString() == test1) 
    { 
     testcase test1 = new testcase(); // instantiate the script 
     test1.script1(); // run the code 
    } 
} 

그러나, 나는 InvalidOperationException occurred 메시지가 나타납니다. 이 작업을 수행하는 또 다른 방법이 있습니까?

답변

2

백그라운드 작업자에게 전화하기 전에 데이터를 백그라운드 스레드에 전달하십시오.

bw.RunWorkerAsync(listbox.SelectedItem.ToString()); 
... 
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string selectedItem = (string)e.Argument; 

    if(selectedItem == test) 
    { 
     testcase test1 = new testcase(); // instantiate the script 
     test1.script1(); // run the code 
    } 

}

2

다른 스레드에서 UI 요소의 값을 읽으려고합니다. 허용되지 않습니다. 따라서 InvalidOperationException이 표시됩니다.

UI 요소는 기본 (UI) 스레드가 소유합니다. 당신은 디스패처를 호출 할 때, 스레드가 안전하게 값이 크로스 스레드 얻기 위해 동기를

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    string selectedItem = ""; 
    this.Dispatcher.Invoke(new Action(() => 
    { 
     selectedItem = listbox.SelectedItem.ToString(); 
    } 

    if(selectedItem == test) 
    { 
     testcase test1 = new testcase(); // instantiate the script 
     test1.script1(); // run the code 
    } 
} 

참고 : 다른 스레드에서 UI 요소에 액세스하기 위해

, 당신은 현재 디스패처를 호출해야합니다. 디스패처 내에서 전체 코드를 호출하지 않으려면 다른 스레드에서 실행하지 않아도됩니다.

+0

내가에만 얻을 수있는'this.Invoke' – Nevets

+1

@nevets 당신은 WPF 또는 윈폼에있는? 신택스는 둘 사이에서 약간 다릅니다. 개념은 같다. – middelpat