【问题标题】:Is this a good practice to handle the displaying of the progress of data processing in a Class library?这是处理类库中数据处理进度显示的好习惯吗?
【发布时间】:2011-07-01 22:47:15
【问题描述】:

我开发了一个 C# 类库,他们的一些方法显示了它的处理进度信息,因为它们读取和写入了数百万条记录,并且用户要求知道进程的进展情况以及他们应该等待的时间。

使用依赖注入来避免“如果控制台应用程序在控制台上写入进度,否则如果 WPF 应用程序显示进度条”,(1)如果调用该方法,我已经在控制台上显示每处理一百万条记录的时间从控制台应用程序和 (2) 如果从 WPF 应用程序调用该方法,我会在 GUI 上显示进度条。

这里的问题是,我正在做的事情是一个好习惯,还是有更好/正确的替代方法?

我最诚挚的问候。

【问题讨论】:

    标签: c# dependency-injection


    【解决方案1】:

    请不要这样做。如果你正在构建一个类库,你应该对 UI 与用户交互做出零假设。

    如果您有一个控制台窗口或 WPF 应用程序,您的解决方案听起来可能有效,但如果它是从网站或服务内部调用的呢?我见过很多服务因为一些流氓类库试图显示一个对话框而被关闭,但周围没有人点击 OK。

    更好的解决方案是在您想要报告一些进度时简单地引发一个事件,并让消费 UI 应用程序担心它希望如何向用户显示该进度。

    了解 BackgroundWorker 类是如何工作的:http://msdn.microsoft.com/en-us/library/8xs8549b.aspx

    【讨论】:

      【解决方案2】:

      我不希望类库显示进度本身。我希望它提供挂钩 - 可能以事件的形式 - 以便无论使用类库都可以以最合适的形式显示该信息。

      您想给予多少控制权(例如,向我报告每项或每 N 项)是您必须自己解决的问题 - 但对于处理程序而言,它应该相当容易工作那种事情自己解决。

      【讨论】:

      • 对于大多数处理数据的类库来说,这是一个非常好的方法。特别是在数据量巨大的情况下。 卑躬屈膝我们不配!!!
      • @Jon Skeet:指定应显示进度窗口的重载(在资源/时间密集型方法上)是否可以接受?
      • @SimpleCoder:除非库以 UI 为中心,否则包含 UI 元素几乎不是一个好主意。正如 Mike Mooney 所说,如果用户想在 ASP 网站中使用该库怎么办?
      • @SimpleCoder:我不这么认为,真的。我认为要么将该代码放在 UI 本身的一个中心位置会更有意义,或者如果在多个 UI 项目中使用该代码具有单独的 以 UI 为中心知道如何做的类库。
      • @Jon Skeet:那么,可以两堂课吗?一个包含核心功能(没有 UI)的类和另一个提供 UI 支持的帮助类?
      【解决方案3】:

      这是一个引发事件的示例,此代码将进入您在后台线程上执行工作的类中。 MessageEventsArgs 派生自 EventArgs (MessageEventArgs : EventArgs),因此可以将自定义信息传递给调用者。这不是必需的,也可以使用 EventArgs e。

      public delegate void SchemaProcessorMessageEventHandler(object sender, MessageEventArgs e);
      public event SchemaProcessorMessageEventHandler SchemaProcessorMessage;
      
      
      protected virtual void OnSchemaProcessorMessage(MessageEventArgs e)
      {
          if (SchemaProcessorMessage != null)
          {
              SchemaProcessorMessage(this, e);
          }
      }
      

      现在在您的调用者 (UI) 中设置事件侦听器。移除事件监听器 -= 完成后。

      _SchemaProcessor = new ServerSchemaUtilityFramework.SchemaProcessor();
      _SchemaProcessor.SchemaProcessorMessage += new ServerSchemaUtilityFramework.SchemaProcessor.SchemaProcessorMessageEventHandler(sp_SchemaProcessorMessage);
      
      void sp_SchemaProcessorMessage(object sender, ServerSchemaUtilityFramework.MessageEventArgs e)
      {
          //Update the UI, if on background will need to (!this.Dispatcher.CheckAccess())     
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-29
        • 2011-07-06
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多