2013-09-27 68 views
0

我不知道如何启动我的服务器连接(简单的按钮点击需要2秒)没有我的用户界面冻结,并建立连接后更新我的用户界面,我可以通过BackgroundWorkerworker_RunWorkerCompleted event内更新我的UI但因为这是不同的线程我需要使用InvokeBackgroundWorker和主线程之间的沟通

private void btnConnect_Click(object sender, EventArgs e) 
{ 
    btnConnect.Enabled = false; 
    BackgroundWorker worker = new BackgroundWorker(); 
    worker.RunWorkerCompleted += worker_RunWorkerCompleted; 
    worker.DoWork += worker_DoWork; 
    worker.RunWorkerAsync(); 
} 

开始做的工作,并连接:

private void worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    try 
    { 
     // Establish the connection... 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

和连接建立后更新我的UI:

private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    // Update UI 
} 

我的问题是我可以避免使用invoke吗? ,因为在我的应用程序中,我有几个要点,我需要添加,删除,更新标签,DatagridView,并以这种方式我会使用Invoke几次,这是一个常见和适当的做到这一点? 有一种方法可以在不同线程中启动某些内容,并且在此线程结束之后仍保留在主线程中?

回答

3

你并不需要在以下回调Invoke

  • ProgressChanged
  • RunWorkerCompleted

在这里,您可以直接访问UI元素没有任何问题。其余需要Invoke