2009-04-03 2 views
0

나는 로컬 데이터베이스의 데이터를 표시하는 창 형식을 가지고 있습니다.백그라운드 스레드의 원격 서버에있는 데이터베이스에 어떻게 연결할 수 있습니까?

또한 원격 데이터베이스에 연결하고 거기에서 다른 데이터를 표시하고 싶습니다. 그러나이 원격 데이터베이스가 다운되거나 느려질 수 있습니다.

이 원격 데이터베이스에 연결하려고 시도하는 동안 UI가 정지되는 것을 원하지 않습니다. 그것이 내가 acheive하려는 어떤

RemoteDataContext rdt; 

private void GetRemoteDataContext() { 
    rdt = new RemoteDataContext(RemoteServerConnectionString); 
} 

private void FillFromRemoteDataContext() { 
    lblTest.text = rdt.TestTable.First().TestField; 
} 

private void Form1_Shown(object sender, EventArgs e) { 
    Thread t = new Thread(new ThreadStart(new delegate { 
     try { 
      GetRemoteDataContext(); 
      FillFromRemoteDataContext(); 
     } catch { } // ignore connection errors, just don't display data 
    ); 
    t.Start; 
} 

그래서 당신이에서 말할 수 있어야 :

그래서 여기 내 손재주없는 예제, 스레드 또는 스레드 안전성에 대해 아무것도 알고하지 않습니다.

내 질문은 무엇이 올바른 방법일까요?


업데이트 :

BackgroundWorker bw = new BackgroundWorker(); 
bw.DoWork += new DoWorkEventHandler((sender, e) => { 
    e.Result = null; 
    try { 
     e.Result = new RemoteDataContext(RemoteServerConnectionString); 
    } catch { } // ignore connection errors, just don't display data 
}); 
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler((sender, e) => { 
    if (e.Result != null) { 
     rdt = (RemoteDataContext)e.Result; 
     FillFromRemoteDataContext();    
    } 
}); 
bw.RunWorkerAsync(); 

을 그리고 스레딩 관련 오류 작동하지 않으며, 지금까지 내가 그것을 이해가 있어야한다 : 고마워, 지금은 (Form1Shown에)있다.

답변

2

BackgroundWorker 클래스를 확인하면 훨씬 쉽게 할 수 있습니다.

진행보고 및 스레드 완료를 위해 실제 작업에 위임자를 지정하기 만하면됩니다.

+0

하 석했다 : 좀 더 세밀한 제어를 위해 이동하는 경향이 나는 당신에게 예를 구현하는 것이 BackgroundWorker '를 선택하십시오. – Blorgbeard

+0

나는 그것이 이미 존재했다고 짐작 했어야했다. – Blorgbeard

1

어떻게해야할까요? 문제는 데이터베이스 연결이 성공하고 UI를 업데이트해야 할 때 크로스 스레드 액세스입니다. CMS에서 BackgroundWorker 클래스를 사용하여 크로스 스레드 마샬링을 처리하도록 제안했습니다. '나는이 질문을 할 때, 나는라는 클래스로 위의 코드를 추상화의 중간에

RemoteDataContext rdt; 
private void GetRemoteDataContext() {  
    rdt = new RemoteDataContext(RemoteServerConnectionString); 
} 
private void FillFromRemoteDataContext() { 
    if (lblTest.Dispatcher.Thread != Thread.CurrentThread) { 
     lblTest.Dispatcher.Invoke(delegate { lblTest.text = rdt.TestTable.First().TestField}); 
    } 
    else { 
     lblTest.text = rdt.TestTable.First().TestField; 
    } 
} 
private void Form1_Shown(object sender, EventArgs e) {  
    ThreadPool.QueueUserWorkItem(delegate {   
     try {    
      GetRemoteDataContext();    
      FillFromRemoteDataContext();   
     } catch { } // ignore connection errors, just don't display data 
    });  
} 
+0

내가 놓친 것이 있습니까? 아니면 게시 한 코드와 동일합니까? – Blorgbeard

+0

죄송합니다. 실수로 코드 서식을 입력하십시오. 예제가 이제 완료되었습니다. – sipwiz

+0

흥미롭지 만 가능한 한 프레임 워크를 다루는 스레드를 많이 남겨 두는 것이 좋습니다. P – Blorgbeard

관련 문제