首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StackOverflow异常

StackOverflow异常
EN

Stack Overflow用户
提问于 2011-04-27 17:38:16
回答 1查看 491关注 0票数 0

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

提前谢谢你,亚历山大

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

代码语言:javascript
复制
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();
    }
EN

回答 1

Stack Overflow用户

发布于 2011-05-05 23:43:05

StackOverflowException是由对许多方法调用造成的,通常是由意外的递归引起的。根据对您发布的代码的粗略检查,我认为它不是罪魁祸首。问题可能出在其他地方。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5802055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档