【问题标题】:How to display progressbar if waithandle is used如果使用了等待句柄,如何显示进度条
【发布时间】:2008-12-03 09:02:41
【问题描述】:

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

frmProgressBar.show();
int successOrFail = PerformSynchronousActionUsingWaitHandle();
frmProgressBar.close();
frmMainScreen.show();

它不起作用,因为 frmProgressBar 会被冻结。 我确实需要保留第 1 行、第 3 行和第 4 行,但是如何重写 PerformSynchronousActionUsingWaitHandle() 以使操作仍然同步但显示进度条。我可以通过在不同线程上显示进度条来解决这个问题,但是系统的设计使得这会非常混乱。

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      您想在线程中运行 PerformSynchronousActionUsingWaitHandle,这样它就不会锁定 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;
               }
          }
      

      【讨论】:

      • 有一个问题。 PerformSynchronousActionUsingWaitHandle() 应该返回错误代码。在这种情况下, StartClick() 应该返回该错误代码。因此,StartClick() 必须等待 PerformSynchronousActionUsingWaitHandle() 完成才能返回。
      • @Hao Wooi Lim - 您可以自定义事件参数以返回任何结果。我已将此添加到上面的代码中。
      【解决方案3】:

      使用两个不同的线程来处理这个...一个线程用于进度条,一个线程用于 PerformSynchronousActionUsingWaitHandle() .. 希望这在某种程度上有所帮助

      【讨论】:

        【解决方案4】:

        您是否尝试过改用 BackgroundWorker 类?不过,您需要重写执行同步任务的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多