Я реализовал «Рабочую форму», которая отображает ход выполнения фоновых задач.
Вот мой код (WorkerForm)
#region Form
private void frmLoader_Load(object sender, EventArgs e)
{
if (OnExecute != null)
{
OnExecute(this, null);
}
}
#endregion
#region "Public"
public void OnInitialize(object sender, EventArgs<String, int> e)
{
if (pbLoader.InvokeRequired)
{
pbLoader.Invoke(new Action<object, EventArgs<String, int>>(OnInitialize), new Object[] { sender, e });
}
else
{
lblDynamicText.Text = e.Param1;
pbLoader.Step = 1;
pbLoader.Minimum = 1;
pbLoader.Value = 1;
pbLoader.Maximum = e.Param2;
}
}
public void OnCreate(object sender, EventArgs<String> e)
{
if (lblDynamicText.InvokeRequired)
{
lblDynamicText.Invoke(new Action<object, EventArgs<String>>(OnCreate), new Object[] { sender, e });
}
else
{
lblDynamicText.Text = e.Param1;
pbLoader.PerformStep();
}
}
public void OnFinished(object sender, EventArgs<String> e)
{
if (lblDynamicText.InvokeRequired)
{
lblDynamicText.Invoke(new Action<object, EventArgs<String>>(OnFinished), new Object[] { sender, e });
}
else
{
lblDynamicText.Text = e.Param1;
}
}
В моем докладчике (я использую архитектуру ModelViewPresenter) я вставляю как ссылку на Winform, так и реальный рабочий класс.
internal WorkerPresenter(IWorkerView WorkerView,IWorker ConcreteWorker)
{
this.WorkerView = WorkerView;
this.ConcreteWorker = ConcreteWorker;
WorkerView.OnExecute += StartExecute;
}
StartExecute вызывается во время события загрузки формы моей рабочей формы.
private void StartExecute(Object sender, EventArgs e)
{
ConcreteWorker.OnCreate += Create;
ConcreteWorker.OnFinish += Finished;
ConcreteWorker.OnInitialize += Initialize;
var task = new Task<bool>(ConcreteWorker.Execute);
task.Start();
task.ContinueWith(c_task =>
{
((frmWorker)WorkerView).DialogResult = System.Windows.Forms.DialogResult.OK;
});
}
Интерфейс IWorker:
public interface IWorker {
event EventHandler<EventArgs<String>> OnCreate;
event EventHandler<EventArgs<String>> OnFinish;
event EventHandler<EventArgs<String, int>> OnInitialize;
bool Execute();
}
Конкретный работник: OnInitialize => Установить текст и количество шагов в вашем индикаторе выполнения.OnCreate => Увеличивает счетчик шагов на один и устанавливает другой текст.OnFinish => отображает текст и снова закрывает рабочую форму.