代码之家  ›  专栏  ›  技术社区  ›  Blorgbeard

如何在后台线程中连接到远程服务器上的数据库?

  •  0
  • Blorgbeard  · 技术社区  · 15 年前

    我有一个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();
    

    2 回复  |  直到 15 年前
        1
  •  2
  •   Christian C. Salvadó    15 年前

    BackgroundWorker 上课时,这会使事情变得容易得多。

    您只需为实际工作、进度报告和线程完成指定代理。

        2
  •  1
  •   sipsorcery    15 年前

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