2011-04-27 3 views
0

J'utilise le client DDE pour attacher et écouter les cours boursiers. Ce client a une méthode de rappel que j'ai implémenté quoi faire quand il reçoit des changements de prix. Le problème est que je reçois StackOverflowException (périodiquement et pas au même intervalle de temps). J'ai trouvé quelque chose à propos de Thread.BeginCriticalRegion(), mais je ne suis pas sûr que cela aiderait. J'ai encore quelques heures jusqu'à l'ouverture du marché quand je peux le tester. Je serais plus que reconnaissant si quelqu'un pouvait me donner une idée sur la façon de remplacer cette exception.StackOverflow exception

Merci à l'avance, Aleksandar

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(); 
    } 

Répondre

0

Un StackOverflowException est causée en faisant à plusieurs appels de méthode habituellement lors de récursion involontaire. Basé sur une vérification rapide du code que vous avez posté, je ne crois pas que ce soit le coupable. Le problème se situe probablement ailleurs.

Questions connexes