【问题标题】:how to update the progress to UI using Events and Delegates如何使用事件和委托更新 UI 的进度
【发布时间】:2012-01-17 11:46:29
【问题描述】:

我在 winform 中有一个按钮,点击它会有一些处理,比如 5 秒。

在此过程中,我想将进度(ProgressBar)更新到 UI 并显示已完成的工作百分比。

如何使用事件和委托来做到这一点?

也欢迎其他方法(活动和代表除外)..

【问题讨论】:

  • 你做了哪些研究? MSDN 上有一些关于此主题的页面以及示例代码。
  • @ChrisF:理论上我知道如何使用事件和委托。但在这种情况下,我不知道如何实现它。我什至不知道如何做任何研究对于这种特殊情况..
  • 没关系,但除非你说明你已经尝试过什么,否则提供的答案可能比没有答案更糟糕。

标签: c# winforms events delegates


【解决方案1】:

下面的伪代码。我手头没有编译器,所以实际的 ProgressBar 界面可能与我记忆中的略有不同。

// service

delegate void ProgressDelegate( int CurrentValue, int MaxValue );

void BusinessProcess( ProgressDelegate progress )
{
   // do something
   progress( 20, 100 );

   // do other things
   progress( 50, 100 );

   // do yet another thing
   progress( 100, 100 );
}

// client

void Button1_Click( object sender, EventArgs e )
{
   BusinessProcess(
      (current, max ) => 
      {
         this.ProgressBar1.Maximum = max;
         this.ProgressBar1.Value = current;
         this.ProgressBar1.Refresh();
      }
      );
}

【讨论】:

  • 这解决了关于进度条的直接问题,但它没有解决如何在 ButtonClick 上进行 5 秒的处理。该程序将“挂起”。
  • 如果您添加Application.DoEvents() 或任何强制处理待处理消息的内容,则不会。这就是为什么我指出这是一个部分解决方案。
  • DoEvents() 引入了一系列(潜在的)其他问题。它需要一个线程。
  • 这是一个单独讨论的话题,远远超出了提问者的要求。
【解决方案2】:

如果您希望在此过程中保持应用程序响应,请使用 BackgroundWorker。请参阅 MSDN 文章 BackgroundWorker Class。它有一个显示如何报告进度的 c# 示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多