【问题标题】:Data throttling C#数据节流 C#
【发布时间】:2012-08-21 18:37:57
【问题描述】:

我正在使用一次最多接受 25KB 数据的第三方组件。我正在将对象数组从我的应用程序传递给这个第三方组件。

但是,我的应用程序写入的数据量远远超过 25KB。我正在从数据库中检索数据并直接调用组件。

我在应用程序中添加了组件的引用。我作为包含原始和非原始类型的对象数组传递给组件的数据。

如何在此处实现数据节流?

【问题讨论】:

  • 请添加更多信息,例如数据是如何发送到组件的,即它是哪种通信方式。
  • 通信的架构和方法是什么?
  • 你在数组中存储什么样的对象,基元?
  • 另外,您如何确定“对象”是否超过 25KB?
  • @DominicZukiewicz:我认为这正是 OP 想要回答的问题。我会简单地测量(例如,使用GC.GetTotalMemory)可以在数组中存储多少对象,直到25KB 超过,然后我会查询并仅发送该数组。

标签: c# performance throttling


【解决方案1】:

您可以计算数据库中一行的大小。 之后,每次传递某些东西时,都会将该大小添加到变量中。 同时,您正在使用运行的秒表。只需检查 Stopwatch.EllapsedSeconds 是否大于 1 秒。如果是,请重置秒表并使用您已经通过的大小重置您的变量。 如果不检查您已经传递的大小(变量的数量)是否大于 25KB。如果这是真的,请致电System.Thread.Thread.Sleep(Math.Max(1000 - StopWatch.EllapsedMilliseconds, 0))。但请记住,您必须在额外的线程中执行此操作,因为 sleep 会阻塞整个线程。

【讨论】:

    【解决方案2】:

    您必须在您的应用和组件之间实现一个数据缓冲区。最好的方法是:

    • 创建一个拥有自己内部线程的类,
    • 在类接口的公共部分实现 Write 方法,该方法接受字节数组并将其存储到队列中
    • 内部线程从队列中写入最多 25kb 的数据块并休眠 1 秒,减去写入数据块所用的时间。

    您还必须小心,如果数据流是连续的并且以 > 25kbps 的速率生成,那么您生成的数据超过了组件的消耗量,您的队列将溢出。

    【讨论】:

      【解决方案3】:

      查看 MSDN 中的 BufferedStream 类示例。您应该能够对其进行调整,以便每秒最多写入 25KB。

      在写入流时,您指定要读取/写入的数据大小,因此如果您说写入 25KB,它返回 24KB,您知道您仍然可以写入 1K。

      如果它返回 25KB 并且缓冲区中仍有未完成的数据,您可以执行Thread.Sleep(1000) 以确保它不超过配额。

      【讨论】:

        猜你喜欢
        • 2017-02-02
        • 2010-09-05
        • 1970-01-01
        • 2019-08-18
        • 1970-01-01
        • 2017-08-28
        • 2012-08-13
        • 2010-10-30
        • 2012-08-06
        相关资源
        最近更新 更多