Приложение WinForms с пользовательским элементом управления LabelProgressBar
, которое может отображать как ход выполнения, так и некоторый описательный текст и / или процент завершения. Это делается путем вызова LabelProgressBar.statusInProgress(string message, int percentageCompletion)
.
. Это можно использовать следующим образом:
private void import_begin(System.Object sender, System.ComponentModel.DoWorkEventArgs args)
{
// first unpack the arguments
System.Object[] arguments = (System.Object[])args.Argument;
System.String filename = (System.String)arguments[0];
System.String why = (System.String)arguments[1];
// tasks:
// 1. read excel file and apply changes to model
// 2. gather changes and format them as XML
// 3. send request to server
// 4. commit/rollback changes
// grab the worker thread so we can report percentage progress
System.ComponentModel.BackgroundWorker worker = (System.ComponentModel.BackgroundWorker)sender;
// now do the work
#region Task1
Controller.Excel excel = new Controller.Excel(filename);
try
{
// the progress of this needs to be tracked
overall_result = excel.import_all(out modified_nodes);
}
catch (InvalidDataExcetpion invDataEx)
{
// deal with it
}
#endregion
worker.ReportProgress(25);
// complete remaining tasks...
}
Обработчик события для работника, сообщающего о своем прогрессе, выглядит следующим образом:
private void import_progress(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
Debug.WriteLine("Import percentage completion: " + e.ProgressPercentage);
labelProgressBar1.statusInProgress("Import", e.ProgressPercentage);
}
Короче говоря, метод import_begin
разбит на несколько «задач». Они разбиты на «подзадачи». Возьмем пример метода import_all
:
public Command_Result import_all(out System.Collections.Generic.List<Model.Data_Node> nodes)
{
Command_Result overall_result = Command_Result.OK;
Command_Result this_result;
nodes = new System.Collections.Generic.List<Model.Data_Node>(excel.Workbook.Worksheets.Count);
Model.Data_Node destination;
// the intent is to report the progress of this particular subtask on the basis of how many worksheets have been processed in this for loop
foreach (OfficeOpenXml.ExcelWorksheet worksheet in excel.Workbook.Worksheets)
{
this_result = import_sheet(worksheet.Name, out destination);
nodes.Add(destination);
if (this_result > overall_result)
{
overall_result = this_result;
}
}
return overall_result;
}
Намерение состоит в том, чтобы этот отчет «подзадачи» отображал прогресс на основе того, сколько листов было обработано в l oop. Вычисление процента для этого является тривиальной задачей, но мне не ясно, как об этом можно сообщить в методе import_begin
. Когда эта «подзадача» завершена, общее выполнение задачи (из POV метода import_begin
) должно составлять 25%. Аналогично для других задач. Как этого достичь?