2016-01-18 139 views
1

我是非常新的使用後臺工作,我想要做的是加載一個表單,說「發送文件」,然後當它完成後關閉該窗體,但我不知道如何打電話或關閉後臺工作者。我有如下一段代碼:如何停止後臺工作人員觸發事件RunWorkerCompleted

bwSendingFiles.RunWorkerAsync(); 

switch (dgvFile.SelectedRows[0].Cells[1].Value.ToString().Trim()) 
{ 
    case "S": 
     SendFile.FilesSFTP_FTP(); 
     break; 
     case "F": 
     SendFile.FilesSFTP_FTP(); 
     break; 
     case "E": 
     SendFile.SendFileEmail(); 
     break; 
} 

bwSendingFiles.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwSendingFiles_RunWorkerCompleted); 

這是我在事件:

private void bwSendingFiles_DoWork(object sender, DoWorkEventArgs e) 
{ 
    formOpen = new SendingScreen(); 
    formOpen.ShowDialog();    
} 

private void bwSendingFiles_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{       
    formOpen.Close();    
} 

如何停止的後臺工作,一旦它與法完成?

+0

您正在關閉BG工作人員的表單實例,這不是一個好主意。 – Rahul

+0

您可以使用標誌來檢查方法是否已完成。 –

+0

我的回答對你有幫助嗎? – Pricey

回答

1

有幾點:

  • 的DoWork的方法在另一個線程中執行,而RunWorkerCompleted方法被觸發主線程一旦DoWork的完成上;

  • 我想說,你應該在主(UI)線程上創建formOpen,然後在主線程上工作(發送文件)。你不應該做的事情,直接從不同的線程的UI元素,而是使用BeginInvoke方法:

    formOpen.BeginInvoke(new Action(() => 
    { 
        formOpen.Close(); 
    })); 
    

我會做更是這樣的:

bwSendingFiles.DoWork += new RunWorkerCompletedEventHandler(bwSendingFiles_DoWork); 
bwSendingFiles.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bwSendingFiles_RunWorkerCompleted); 
formOpen = new SendingScreen(); 
formOpen.ShowDialog(); 

bwSendingFiles.RunWorkerAsync(dgvFile.SelectedRows[0].Cells[1].Value.ToString().Trim()); 

private void bwSendingFiles_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var arg = (string)e.Argument 
    switch (arg) 
    { 
     case "S": 
      SendFile.FilesSFTP_FTP(); 
      break; 
     case "F": 
      SendFile.FilesSFTP_FTP(); 
      break; 
     case "E": 
      SendFile.SendFileEmail(); 
      break; 
    } 
} 

private void bwSendingFiles_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{       
    formOpen.Close();    
}