是的,除了
Application.DoEvents();
主要的问题是,您希望使用基于过程的方法,但您应该基于消息。
我会尽力解释的。
public partial class MyForm : Form
{
ProgressBar progress;
Button startTaskButton;
void OnClick_startTaskButton();
您希望在后台使用Thread/Process/BackgroundWorker或ThreadPool启动一些耗时的任务。您需要该表单与用户交互,并向用户显示所述任务执行期间的任务进度。
因此,您需要至少中断ProgressStaff两个方法:第一个方法将启动任务执行,第二个方法将在任务完成事件时作出反应。
//Off-top:正如我看到的那样,你的第三个partyobject类没有收到表单的实例,所以你应该手动同步。
void OnClick_startTaskButton()
{
ProcessStuff(GetTask(), this);
}
private void ProcessStuff(Task sometask, Form progressform)
{
if (sometask.foo == "A")
DoStuff(); //This one is SYNchronous
else
{
ThirdPartyObject Q = new ThirdPartyObject();
Q.ProgessChanged += delegate(object sender, ProgressChangedEventArgs e)
{ TaskProgessChanged(sender, e); };
Q.TaskCompleted += delegate(object sender, TaskResult result)
{ TaskCompleted(sender, result); };
Q.Execute("X", "Y", "Z"); //This one executes ASYNchronous
}
}
void TaskProgessChanged(object sender, ProgressChangedEventArgs e)
{
if (InvokeRequired) Invoke(TaskProgessChanged, new object[] {sender, e} );
else ShowProgress(e.ProgressPercentage);
}
void TaskCompleted(object sender, TaskResult result)
{
if (InvokeRequired) Invoke(TaskComplete, new object[] {sender, result} );
else {
MessageBox.Show("Task is completed with result :" + result.ToString());
}
}
======================
真正地
private void ProcessStuff(Task sometask, Form progressform)
{
ProcessStuff(sometask, progressform, true);
}
private void ProcessStuff(Task sometask, Form progressform, bool isNewTask)
{
if (isNewTask)
if (sometask.foo == "A")
DoStuff(); //This one is SYNchronous
else
{
ThirdPartyObject Q = new ThirdPartyObject();
Q.ProgessChanged += delegate(object sender, ProgressChangedEventArgs e) {
progressform.ShowProgress(e.ProgressPercentage);
};
Q.TaskCompleted += delegate(object sender, TaskResult result)
{ ProcessStuff(sometask, this, false); };
Q.Execute("X", "Y", "Z"); //This one executes ASYNchronous
}
else
{
if (InvokeRequired) Invoke(TaskComplete, new object[] {sender, result, isNewTask} );
else {
//Task is completed
MessageBox.Show("Task is completed");
}
}
}
但我认为那是不好的风格;)