我是使用后台工作者的新手,我正在尝试做的是加载一个显示"发送文件"的表单,然后在它完成后关闭该表单,但我不知道如何调用或关闭后台工作线程。我拥有的是以下代码段:
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();
}
使用方法完成后,如何停止后台工作线程?
几点:
- 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();
}