[英]Proper Way cancel Background Worker in Excel process
提供以下代码是取消Background Worker的最佳方法,以便Excel正确关闭。 例如,如果用户在excel流程的中间关闭表单。 下面的代码工作正常。 只是盯着后台工作人员,所以只想了解它,并想以正确的方式来做即可。 基本上,下面的代码将允许用户使用复选框选择要导出的列(字段)。 int [] cols是他们选择的列的对应数字。
*这里是更新的代码。 我将建议与取消和循环期间的中断一起使用,以及基本的bgw msdn文章。 我想不出另一种方法来检查何时退出Excel,所以我使用了行数。 谢谢你的提示。
private void XLWorker_DoWork(object sender, DoWorkEventArgs e)
{
this.XLWorker.ReportProgress(-1);
xl._Application app = new Microsoft.Office.Interop.Excel.Application();
xl._Workbook workbook = app.Workbooks.Add(Type.Missing);
// creating new Excelsheet in workbook
xl._Worksheet worksheet = null;
// get the reference of first sheet. By default its name is Sheet1.
// store its reference to worksheet
worksheet = workbook.Sheets[1];
worksheet = workbook.ActiveSheet;
// changing the name of active sheet
worksheet.Name = "User Details";
worksheet.Cells.Font.Size = "12";
int headerCounter = 1;
foreach (int col in _export)
{
worksheet.Cells[1, headerCounter] = _form.DataGridResultsSet.Columns[col].HeaderText;
headerCounter++;
}
//Format zip code
xl.Range rngResult = null;
xl.Range FindRange = null;
int rowCount = worksheet.UsedRange.Rows.Count;
for (int columnIndex = 1; columnIndex <= worksheet.UsedRange.Rows.Count; columnIndex++)
{
FindRange = worksheet.UsedRange.Columns[columnIndex];
rngResult = FindRange.Find("ZipCode", Type.Missing, Type.Missing, Type.Missing, Type.Missing, xl.XlSearchDirection.xlNext, Type.Missing, Type.Missing, Type.Missing);
if (rngResult != null)
{
rngResult.EntireColumn.NumberFormat = "00000";
}
}
//Add rows
int colCounter = 0;
int pending = 0;
for (int i = 0; i < _form.DataGridResultsSet.Rows.Count - 1; i++)
{
if ((XLWorker.CancellationPending == true))
{
e.Cancel = true;
break;
}
else
{
foreach (int col in _export)
{
worksheet.Cells[i + 2, colCounter + 1] = _form.DataGridResultsSet.Rows[i].Cells[col].Value.ToString();
colCounter++;
}
colCounter = colCounter - _export.Length;
XLWorker.ReportProgress((i * 100) / _form.DataGridResultsSet.Rows.Count - 1);
}
pending = i;
}
int cancel = pending + 2;
if (cancel < _form.DataGridResultsSet.Rows.Count)
{
Marshal.FinalReleaseComObject(rngResult);
Marshal.FinalReleaseComObject(FindRange);
Marshal.FinalReleaseComObject(worksheet);
rngResult = null;
FindRange = null;
worksheet = null;
workbook.Close(false, Type.Missing, Type.Missing);
app.Application.Quit();
app.Quit();
Marshal.FinalReleaseComObject(workbook);
workbook = null;
Marshal.FinalReleaseComObject(app);
app = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
else
{
//Format sheet
worksheet.Columns.AutoFit();
worksheet.Cells.HorizontalAlignment = xl.XlHAlign.xlHAlignLeft;
worksheet.Cells.Font.Size = "11";
xl.Range rngB = (xl.Range)worksheet.Rows[1];
rngB.Font.Bold = true;
//Worker completed
XLWorker.ReportProgress(100);
Marshal.FinalReleaseComObject(rngResult);
Marshal.FinalReleaseComObject(FindRange);
Marshal.FinalReleaseComObject(rngB);
Marshal.FinalReleaseComObject(worksheet);
Marshal.FinalReleaseComObject(workbook);
rngResult = null;
FindRange = null;
rngB = null;
worksheet = null;
workbook = null;
//Sleep unti export is complete
Thread.Sleep(1000);
//Show Excel
app.Visible = true;
//Cleanup
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
private void XLWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.ProgressPercentage < 0)
{
this.buttonActExport.Text = "Calculating...";
toolStripProgressBar1.Visible = true;
toolStripStatusLabel1.Visible = true;
}
else if (e.ProgressPercentage != 100)
{
this.buttonActExport.Text = ("Exporting: " + e.ProgressPercentage.ToString() + "%");
toolStripProgressBar1.Value = e.ProgressPercentage;
}
else
{
this.buttonActExport.Text = "Done";
toolStripProgressBar1.Value = e.ProgressPercentage;
}
}
private void XLWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if ((e.Cancelled == true))
{
this.buttonActExport.Text = "Canceled!";
}
else if (!(e.Error == null))
{
this.buttonActExport.Text = ("Error: " + e.Error.Message);
}
else
{
this.buttonActExport.Text = "Done!";
}
this.buttonActExport.Text = "Export";
this.buttonActExport.Enabled = true;
toolStripProgressBar1.Visible = false;
toolStripStatusLabel1.Visible = false;
toolStripProgressBar1.Value = 0;
}
您需要执行“合作取消”,您需要修改代码以与取消过程“合作”,并优雅地停止其尝试执行的操作。 所需要做的就是检查整个代码中的workerXL.CancellationPending
,如果返回true,则执行适当的步骤来“取消”该操作,例如处置必要的资源并关闭excel实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.