2011-04-27 2 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은 일반적으로 의도하지 않은 재귀로 인한 호출 많은 방법함으로써 발생합니다. 당신이 게시 한 코드의 간단한 검사에 근거하여 나는 그것이 범인이라고 생각하지 않습니다. 문제는 아마도 다른 곳에있을 것입니다.