并行调用需要很长时间才能启动

时间:2014-06-18 19:56:09

标签: c# multithreading c#-4.0

我需要一些建议。我有一个应用程序处理来自股票exachanges的实时数据馈送的交易信息。我的处理工作落后了。

由于我在拥有32 GB主内存的3GHz Intel I7上运行,因此我应该有足够的电量来执行此应用程序。 Parse例程将交易信息存储在运行于Windows 2012 R2 Server的SQL Server 2014数据库中。

我将以下时序信息放在主处理循环中:

  invokeTime.Restart();

  Parallel.Invoke(() => parserObj.Parse(julian, data));

  invokeTime.Stop();
  var milliseconds = invokeTime.ElapsedMilliseconds;
  if (milliseconds > maxMilliseconds) {
    maxMilliseconds = milliseconds;
    messageBar.SetText("Invoke: " + milliseconds);
  }

我得到了1122毫秒来做Parallel.Invoke。类似的定时测试表明,Parse例程只需要7毫秒(最大值)。

除了执行Parallel.Invoke?

之外,还有更好的处理数据的方法吗?

任何建议都将不胜感激。

查尔斯

2 个答案:

答案 0 :(得分:0)

你试过吗

Task.Factory.StartNew(() => {
 parserObj.Parse(julian, data));
});

你的Parse方法怎么样?也许瓶颈就在那里......

答案 1 :(得分:0)

在Stephen Toub的文章中:http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx他描述:“Task.Run可以而且应该用于简单卸载一些要在ThreadPool上处理的工作的最常见情况”。这正是我想要做的,将Parse rosutine卸载到后台线程。所以我改变了:

Parallel.Invoke(()=> parserObj.Parse(julian,data));

为:

Task.Run(()=> parserObj.Parse(julian,data));

我还通过执行以下操作将ThreadPool中的线程数从8增加到80:

    int minWorker, minIOC;;
    ThreadPool.GetMinThreads(out minWorker, out minIOC);
    var newMinWorker = 10*minWorker;
    var newMinIOC = 10*minIOC;
    if (ThreadPool.SetMinThreads(newMinWorker, newMinIOC)) {
      textBox.AddLine("The minimum no. of worker threads is now: " + newMinWorker);
    } else {
      textBox.AddLine("Drat! The minimum no. of worker threads could not be changed.");
    }

解析循环运行6个半小时/天,如下所示:

    var stopWatch = new Stopwatch();
    var maxMilliseconds = 0L;
    while ((data = GetDataFromIQClient()) != null) {
      if ( MarketHours.IsMarketClosedPlus2() ) {
        break;
      }
      stopWatch.Restart();

      Task.Run(() => parserObj.Parse(julian, data));

      stopWatch.Stop();
      var milliseconds = stopWatch.ElapsedMilliseconds;
      if (milliseconds > maxMilliseconds) {
        maxMilliseconds = milliseconds;
        messageBar.SetText("Task.Run: " + milliseconds);
      }
    }

现在,调用Task.Run所花费的最长时间是96毫秒,而在解析器上花费的最长时间是18毫秒。我现在正在跟上数据传输。

查尔斯