![](/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.