2013-08-22 2 views
-2

내 문제는 단순히 내 SQL 쿼리를 완료하는 데 2 ​​분 이상 걸리고 모든 데이터를 가져 오는 동안 응용 프로그램이 멈추지 않을 수 있습니다. 멀티 스레딩을 시도했지만 오류가 발생하여 계속 인식하고 있습니다. 내 코드가 그 밑에있다.스레드에 데이터로드

크로스 스레드 작업이 유효하지 않습니다. 'labelEdit1'컨트롤이 작성된 스레드가 아닌 다른 스레드에서 액세스했습니다. 다음 알려 주시기 바랍니다이 작업을 수행하는 더 나은 방법이있는 경우 응용 프로그램이 얼어하지 않는 데이터가 comboEdit에로드받을 수 있도록

private void Form_Load(object sender, EventArgs e) 
    { 
     startup = new Thread(loadInThread); 
     startup.Start();    
    } 

private void loadInThread() 
{ 
    //getsDataFromSQL() is the method that takes over 2 minutes to do 
    //it returns a String Array if that is helpful 
    comboEdit1.Properties.Items.AddRange(getsDataFromSQL()); 
    startup.Abort(); 
} 

, 내가 필요한 모든입니다. 또한 SQL 문을 최적화 할 수 있지만이 질문에 대한 것이 아니라는 것을 알고 있으므로 제안하지 마십시오.

+0

크로스 스레드 예외에 대한 조사를 수행 했습니까? 이 질문에 대한 가장 처음으로 관련된 질문은 제목이 "크로스 스레드 작업이 유효하지 않습니다 : 스레드가 만든 스레드가 아닌 다른 스레드에서 액세스 제어"... –

+0

http://stackoverflow.com/questions/142003/cross -thread-operation-not-valid-control-than-the-the-other-than-the-the-rq = 1 –

+0

-1 연구 부족 –

답변

1

여기에서 운영자를 사용해야합니다. 다른 스레드에서 UI 스레드가 소유 한 컨트롤에 액세스 할 수 없기 때문입니다. 이 링크를 확인하십시오 here. 컴파일 오류를 확인하지는 않았지만 약간의 수정을 통해 트릭을 수행해야합니다.

private void loadInThread() 
{ 
    //getsDataFromSQL() is the method that takes over 2 minutes to do 
    //it returns a String Array if that is helpful 
    comboEdit1.Dispatcher.BeginInvoke((Action)(() => 
    { 
     comboEdit1.Properties.Items.AddRange(getsDataFromSQL()); 
    })); 
    startup.Abort(); 
} 
+0

이제 comboEdit1에 Dispatcher 메서드가 없다는 오류가 발생합니다. Devexpress comboBox를 사용하고 있기 때문에 가능성이 있습니까? –

+0

"comboEdit1.Dispatcher.BeginInvoke"대신 "Dispatcher.BeginInvoke"를 시도하십시오. 참고로 .NET Framework 3 이상에서 소개 된 Dispatcher는 System.Windows.Threading 네임 스페이스에 있지만 System.Threading에는 없습니다. – samar

1

어떻게 멀티 스레딩을 수행하고 있습니까? 스레드를 수동으로 만들고 있습니까? 그러지 마. 나는 다음과 같은 세 가지 방법 중 하나를가는 것이 좋습니다 것 :

  1. async/await-http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx (.NET 4.5+ 만)
  2. 태스크 병렬 라이브러리 - http://msdn.microsoft.com/en-us/library/dd460717.aspx (.NET 4.0 이상 만 해당)
  3. BackgroundWorker - http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

물론 수동으로 스레드 논리를 처리하는 것도 가능합니다. 이 경우 BeginInvoke 메소드 인 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.begininvoke.aspx을 살펴볼 수 있습니다.