2011-04-27 89 views
0

我正在使用DDE客户端附加并聆听股票市场价格。该客户有一个回调方法,我实施了接收价格变化时要做的事情。问题是我得到StackOverflowException(周期性而不是在相同的时间间隔)。我发现了一些关于Thread.BeginCriticalRegion()的内容,但我不确定它是否有帮助。当我可以测试时,我还有几个小时才能开市。 如果有人能给我一个想法如何覆盖这个异常,我会更加伟大。StackOverflow异常

由于提前, 亚历山大

IList<SymbolObject> _symbols; //initialized when the app runs for the first time

void _ddeClient_Advise(object sender, DdeAdviseEventArgs args) 
    { 
     if (!IsReady) 
      return; 

     if (string.IsNullOrEmpty(args.Text)) 
     { 
      _logMessages.LogMessagesAdd("advise dde symbol", string.Format("args.Text is empty or NULL for {0}", args.Item), true); 
      return; 
     } 

     try 
     { 
      string[] argsArray = args.Text.Replace("\0", "").Replace('\0'.ToString(), "").Split(' '); // sometimes happens here 

      var list = _symbols.Where(s => s.DDESymbol == args.Item).ToList(); 
      if (list.Count == 0) 
       return; 

      decimal? val = null; 
      try 
      { 
       var stringParts = StringUtils.CleanProphitXUrl(argsArray[0]).Split('.'); 
       argsArray = null; 

       if (stringParts.Length >= 2) 
        val = decimal.Parse(stringParts[0] + "." + (stringParts[1].Length > 2 ? stringParts[1].Substring(0, 2) : stringParts[1])); 
       else 
        val = decimal.Parse(stringParts[0]); 

       stringParts = null; 
      } 
      catch (Exception ex) 
      { 
       _logMessages.LogMessagesAdd("call Price Alerts application service", ex.Message, true); 
       return; 
      } 

      foreach (var l in list) 
      { 
       if (_lastPrices[l.DDESymbol] == null) 
        continue; 

       if (_lastPrices[l.DDESymbol].ToString() != val.ToString()) 
       { 
        try 
        { 
         _quotePublishingService.PublishQuote(l.DDESymbolId, l.Symbol, args.Item, val, WebSyncPublisherUrl, 
          PublishingChannel); // a call to wcf service 
        } 
        catch (Exception ex) 
        { 
         _logMessages.LogMessagesAdd("call the service", ex.Message, true); // save to sql db 
         return; 
        } 

        _lastPrices[l.DDESymbol] = val.ToString(); 
       } 
      } 
      list = null; 
      val = null; 
     } 
     catch 
     { 
     }    
    } 

public static string CleanProphitXUrl(string value) // StringUtils.CleanProphitXUrl snippet 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.Append(value.Substring(0, value.LastIndexOf(".") + 1)); 

     try 
     { 
      value = value.Replace('\r'.ToString(), "").Replace('\t'.ToString(), "").Replace('\n'.ToString(), ""); 
      for (int i = sb.Length; i < value.Length; i++) 
      { 
       if (char.IsNumber(value[i])) 
        sb.Append(value[i]); 
      } 
     } 
     catch 
     { 

     } 

     return sb.ToString(); 
    } 

回答

0

StackOverflowException是通过使许多方法调用通常是从非故意递归产生引起的。根据你张贴的代码的粗略检查,我不相信这是罪魁祸首。问题可能在别的地方。

相关问题