繁体   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