2011-04-27 103 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是通過使許多方法調用通常是從非故意遞歸產生引起的。根據你張貼的代碼的粗略檢查,我不相信這是罪魁禍首。問題可能在別的地方。