![](/img/trans.png)
[英]How can I programmatically connect to a remote database server that requires an SSH tunnel?
[英]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.