簡體   English   中英

如何在后台線程中連接到遠程服務器上的數據庫?

[英]How can I connect to a database on a remote server in a background thread?

我有一個Windows窗體,在其中顯示本地數據庫中的數據。

我也想連接到遠程數據庫,並從那里顯示其他數據。但是,此遠程數據庫可能已關閉或運行緩慢。

嘗試連接到此遠程數據庫時,我不希望UI凍結。

因此,對於線程或線程安全一無所知,這是我的例子。

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;
}

因此,您應該能夠從中看出我想要實現的目標。

我的問題是,正確的解決方法是什么?


更新:謝謝大家,現在我(在Form1Shown ):

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();

它有效,據我所知,應該沒有與線程相關的錯誤。

您可能想檢查BackgroundWorker類,這會使事情變得容易得多。

您只需要為實際工作,進度報告和線程完成指定委托。

多數民眾贊成在我將如何做的路線,但您將遇到的問題是當數據庫連接成功並且需要更新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   
    });    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM