C# 如果使用waithandle,如何显示progressbar
在代码的某个地方,waitHandle用于执行某些操作。然而,waithandle的问题是表单在等待某些操作完成时冻结。因此,以下代码不起作用:C# 如果使用waithandle,如何显示progressbar,c#,multithreading,C#,Multithreading,在代码的某个地方,waitHandle用于执行某些操作。然而,waithandle的问题是表单在等待某些操作完成时冻结。因此,以下代码不起作用: frmProgressBar.show(); int successOrFail = PerformSynchronousActionUsingWaitHandle(); frmProgressBar.close(); frmMainScreen.show(); 它不会工作,因为frmProgressBar将被冻结。 我确实需要保持第1行、第3行和第
frmProgressBar.show();
int successOrFail = PerformSynchronousActionUsingWaitHandle();
frmProgressBar.close();
frmMainScreen.show();
它不会工作,因为frmProgressBar将被冻结。
我确实需要保持第1行、第3行和第4行,但如何使用WaitHandle()重写PerformSynchronousAction,以便操作仍然同步,但显示进度条。我可以通过在另一个线程上显示进度条来解决这个问题,但是系统的设计会非常混乱。您不能使用BackgroundWorker类吗 使用两个不同的线程来处理此。。。一个线程用于进度条,一个线程用于使用WaitHandle()执行同步操作。。希望这在某种程度上有所帮助您尝试过使用该类吗?不过,您需要重写执行同步任务的方法。您希望在线程中使用WaitHandle运行PerformSynchronousAction,这样它就不会锁定ui线程
public event EventHandler<WorkCompleteArgs> WorkComplete;
private void StartClick(object sender, EventArgs e)
{
//hook a complete event
this.WorkComplete += new EventHandler(OnWorkComplete);
//do start code
//run the PerformSynchronousActionUsingWaitHandle process in a thread
Thread thread = new Thread(new ThreadStart(PerformSynchronousActionUsingWaitHandle));
thread.Start();
}
private void OnWorkComplete(object sender, EventArgs e)
{
//cross thread
if (this.InvokeRequired)
{
this.BeginInvoke(new EventHandler(OnWorkComplete), new object[] { sender, e });
return;
}
//un hook
this.WorkComplete -= new EventHandler(OnWorkComplete);
//do complete code
}
private void PerformSynchronousActionUsingWaitHandle()
{
Thread.Sleep(1000);
if (WorkComplete != null)
{
//use event args to return the functions result if needed.
WorkComplete(this, new WorkCompleteArgs(true));
}
}
public class WorkCompleteArgs
{
public WorkState {get;private set;}
public WorkCompleteArgs(bool workState)
{
this.WorkState = workState;
}
}
公共事件事件处理程序工作完成;
私有void StartClick(对象发送方,事件参数e)
{
//勾引一个完整的事件
this.WorkComplete+=新事件处理程序(OnWorkComplete);
//开始代码
//在线程中运行PerformSynchronousActionUsingWaitHandle进程
线程线程=新线程(新线程开始(使用WaitHandle执行同步操作));
thread.Start();
}
私有void OnWorkComplete(对象发送方,事件参数e)
{
//交叉线
if(this.invokererequired)
{
this.BeginInvoke(新事件处理程序(OnWorkComplete),新对象[]{sender,e});
返回;
}
//脱钩
this.WorkComplete-=新事件处理程序(OnWorkComplete);
//完成代码吗
}
私有void使用WaitHandle()执行同步操作
{
睡眠(1000);
如果(工作完成!=null)
{
//如果需要,使用事件参数返回函数结果。
WorkComplete(这是新的workcompletetargs(true));
}
}
公共类WorkCompleteArgs
{
公共工作状态{get;private set;}
公共工作完成RGS(布尔工作状态)
{
this.WorkState=工作状态;
}
}
有一个问题。PerformSynchronousActionUsingWaitHandle()应该返回错误代码。在本例中,StartClick()应该返回该错误代码。因此,StartClick()必须等待PerformSynchronousActionUsingWaitHandle()完成后才能返回。@Hao Wooi Lim-您可以自定义事件参数以返回任何结果。我已将此添加到上面的代码中。