Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果使用waithandle,如何显示progressbar_C#_Multithreading - Fatal编程技术网

C# 如果使用waithandle,如何显示progressbar

C# 如果使用waithandle,如何显示progressbar,c#,multithreading,C#,Multithreading,在代码的某个地方,waitHandle用于执行某些操作。然而,waithandle的问题是表单在等待某些操作完成时冻结。因此,以下代码不起作用: frmProgressBar.show(); int successOrFail = PerformSynchronousActionUsingWaitHandle(); frmProgressBar.close(); frmMainScreen.show(); 它不会工作,因为frmProgressBar将被冻结。 我确实需要保持第1行、第3行和第

在代码的某个地方,waitHandle用于执行某些操作。然而,waithandle的问题是表单在等待某些操作完成时冻结。因此,以下代码不起作用:

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-您可以自定义事件参数以返回任何结果。我已将此添加到上面的代码中。