none
Крах плагина на компьютерах с сенсорным вводом RRS feed

  • Вопрос

  • Добрый день!

    Наша компания разрабатывает собственный продукт с использованием технологии Silverlight 5.

    У нас с одним клиентом возникла проблема, которая заключается в падении плагина Silverlight и перезагрузке браузера.

    При этом установлено, что данная проблема возникает только на компьютерах с сенсорным вводом. Например, вот так выглядит диагностика ошибки под отладкой на примере установки свойства для DataGrid:

    "Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена".

     При этом код следующий:

    private void rgvMemoryProfilerData_SelectionChanged(object sender, SelectionChangeEventArgs e)
            {
                if (e.AddedItems != null && e.AddedItems.Count > 0)
                {
                    GridViewRowDetailsVisibilityMode mode = (((MemoryProfiler.MemoryLeakItem)e.AddedItems.ElementAt(0)).VisibleDetails ? GridViewRowDetailsVisibilityMode.VisibleWhenSelected : GridViewRowDetailsVisibilityMode.Collapsed);
                                       rgvMemoryProfilerData.RowDetailsVisibilityMode = mode;
                }
            }

    Также установлено, что данная ошибка может возникнуть в любом месте программы по непонятной причине, например:
                        System.Collections.IEnumerable list = TreePanelSettings.ItemsSource;
                        TreePanelSettings.ItemsSource = null;
                        TreePanelSettings.ItemsSource = list;
                      
                        list = TreePanelInicators.ItemsSource;
                        TreePanelInicators.ItemsSource = null;
                        TreePanelInicators.ItemsSource = list;
    
                        //Падает на Win7 Home Pre with MultiTouch
                        //list = TreePanelReports.ItemsSource;
                        //TreePanelReports.ItemsSource = null;
                        //TreePanelReports.ItemsSource = list; // <-- НА ЭТОЙ СТРОЧКЕ СТАБИЛЬНО ПРОИСХОДИТ КРАХ ПЛАГИНА ПРИ ВЫЗОВЕ ДАННОГО МЕТОДА
    
                        list = TreePanelSysInicators.ItemsSource;
                        TreePanelSysInicators.ItemsSource = null;
                        TreePanelSysInicators.ItemsSource = list;
    
                        list = TreePanelMonitors.ItemsSource;
                        TreePanelMonitors.ItemsSource = null;
                        TreePanelMonitors.ItemsSource = list;
    
                        list = TreeStrategyMap.ItemsSource;
                        TreeStrategyMap.ItemsSource = null;
                        TreeStrategyMap.ItemsSource = list;
    


    Еще пример класса, в котором происходит падение:
        public class GridDisposable : Grid, IDisposable
        {
            public GridDisposable() : base()
            {
            }
        #region IDisposable Members
            [Browsable(false)]
            public bool IsDisposed { get; private set; }
    
            private event EventHandler disposed;
    
            /// <summary>
            /// Occurs when this instance is disposed.
            /// </summary>
            public event System.EventHandler Disposed { add { disposed += value; } remove { disposed -= value; } }
    
            /// <summary>
            /// Releases unmanaged and - optionally - managed resources
            /// </summary>
            public void Dispose()
            {
                if (!IsDisposed)
                {
                    try { this.Dispose(true); } finally { IsDisposed = true; }
                }
            }
    
            /// <summary>
            /// Releases unmanaged and - optionally - managed resources
            /// </summary>
            /// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
            protected virtual void Dispose(bool disposing)
            {
                if (disposing)
                {
                    this.Children.Clear();  // <-- НА ЭТОЙ СТРОЧКЕ ПРОИСХОДИТ КРАХ ПЛАГИНА ПРИ ВЫЗОВЕ ДАННОГО МЕТОДА, ПРИ ЭТОМ СВОЙСТВО
    				                        //     Contents РОДИТЕЛЬСКОГО КОНТРОЛА УЖЕ УСТАНОВЛЕНО B null. ПРИ ЭТОМ В ПЕРВЫЙ РАЗ ДАННЫЙ ВЫЗОВ
    										//     МОЖЕТ УСПЕШНО ОТРАБОТАТЬ, А МОЖЕТ И СРАЗУ ПРИВЕСТИ К ОШИБКЕ.
                    this.DataContext = null;
                    this.Tag = null;
                    if (disposed != null)
                    {
                        disposed(this, System.EventArgs.Empty);
                        disposed = null;
                    }
                }
            }
        #endregion IDisposable Members
        }
    	
    Исправление ошибок для нас является критичным, т.к. в этом случае программа работает нестабильно и мы не можем гарантировать, что программа не завершится крахом где-нибудь еще.
    4 июня 2013 г. 10:07

Ответы

  • Минуточку, что-то мне не нравится реализатия IDisposable, возможно исключение выбрасывается из-за попыток неверного освобождения ресурсов.

    protected virtual void Dispose(bool disposing)
            {
                if (disposing)
                {
                    //Может у Вас метод вызывается на объекте
                    //Children, который уже где-нибудь     
                    //установлен как null, а это есть и причина исключения.
                    this.Children.Clear();
                    this.DataContext = null;
                    this.Tag = null;
                    if (disposed != null)
                    {
                        disposed(this, System.EventArgs.Empty);
                        disposed = null;
                    }
                }
            }

    "ПРИ ЭТОМ В ПЕРВЫЙ РАЗ ДАННЫЙ ВЫЗОВ // МОЖЕТ УСПЕШНО ОТРАБОТАТЬ, А МОЖЕТ И СРАЗУ ПРИВЕСТИ К ОШИБКЕ." - а то, что исключение может быть выброшено в произвольный момент, объясняет поведение сборщика мусора, который запускается без определённого плана. Возможно ссылка, на которой вызывается метод, уже не указывает на это объект, содержимое которого подобрано сборщиком мусора.

    8 июня 2013 г. 13:45
    Модератор

Все ответы

  • С чем это связано и как исправить?
    4 июня 2013 г. 10:08
  • Неужели ни кто не сталкивался с такой проблемой?
    4 июня 2013 г. 13:34
  • Привет. Возможно это баг. А проблема носит локальных характер, т.е. на одной машине не работает или на разных и какие версии браузера используются?
    Модератор
  • Мы протестировали на разных компьютерах. Этот баг воспроизводится только на машинах, где есть сенсорный экран. На компьютерах без сенсорного ввода этой проблемы нет.

    Также мы проверяли на разных версиях IE (х86 и х64), FireFox, Opera, Chrome. Результат везде один и тот же (что описан выше).

  • Здравствуйте,

    В случае что это баг, можно отписаться в Майкрософт, смотрите ссылки:

    Submitting Bugs

    https://connect.microsoft.com/directory/developer-tools/


    Если вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение"

    Модератор
  • Минуточку, что-то мне не нравится реализатия IDisposable, возможно исключение выбрасывается из-за попыток неверного освобождения ресурсов.

    protected virtual void Dispose(bool disposing)
            {
                if (disposing)
                {
                    //Может у Вас метод вызывается на объекте
                    //Children, который уже где-нибудь     
                    //установлен как null, а это есть и причина исключения.
                    this.Children.Clear();
                    this.DataContext = null;
                    this.Tag = null;
                    if (disposed != null)
                    {
                        disposed(this, System.EventArgs.Empty);
                        disposed = null;
                    }
                }
            }

    "ПРИ ЭТОМ В ПЕРВЫЙ РАЗ ДАННЫЙ ВЫЗОВ // МОЖЕТ УСПЕШНО ОТРАБОТАТЬ, А МОЖЕТ И СРАЗУ ПРИВЕСТИ К ОШИБКЕ." - а то, что исключение может быть выброшено в произвольный момент, объясняет поведение сборщика мусора, который запускается без определённого плана. Возможно ссылка, на которой вызывается метод, уже не указывает на это объект, содержимое которого подобрано сборщиком мусора.

    8 июня 2013 г. 13:45
    Модератор