Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> метод Dispose для объекта MyWebClient 
V
    Опции темы
vladd
Дата 14.3.2012, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 31.1.2009

Репутация: нет
Всего: нет



vs 2010 
Есть код 
Код

Private Sub GetGraph()
        Dim MarketId, SelectionId As String
        Dim ImageInBytes() As Byte
        Dim dt As DateTime
        Dim StTime As String
        Dim Pos1 As Integer
        Dim MyWebClient As System.Net.WebClient = Nothing
        Try
            MyWebClient = New System.Net.WebClient
            'Первый график
            MarketId = Exl.Worksheets("Возрастающие графики").Cells(3, 4).Value
            SelectionId = Exl.Worksheets("Возрастающие графики").Cells(3, 6).Value
            Exl.Worksheets("Рынки скачек").Cells(32, 4).Value = SelectionId
            ImageInBytes = MyWebClient.DownloadData("http://uk.site.sports.betfair.com_
/betting/LoadRunnerInfoChartAction.do?marketId=" _
& MarketId & "&selectionId=" & SelectionId & "&asianLineId=0")

            Using ImageStream As New IO.MemoryStream(ImageInBytes)
                PictureBox1.Image = New System.Drawing.Bitmap(ImageStream)
            End Using
            ' Извлечение даты из ячейки Excel
            Dim value As Object = Exl.Worksheets("Возрастающие графики").Cells(3, 1).Value
            If Not value Is Nothing Then
                If TypeOf value Is Double Then
                    dt = DateTime.FromOADate(CType(value, Double))
                Else
                    DateTime.TryParse(CType(value, String), dt)
                End If
            End If
            Pos1 = InStr(1, dt.ToString(), " ") 'пробел между датой и временем
            StTime = Mid(dt.ToString(), Pos1 + 1)        ' выделяем время

            Exl.Worksheets("Рынки скачек").Cells(32, 1).Value = dt
            Exl.Worksheets("Рынки скачек").Cells(32, 2).Value = Exl.Worksheets("Возрастающие графики").Cells(3, 3).Value
            Exl.Worksheets("Рынки скачек").Cells(32, 3).Value = Exl.Worksheets("Возрастающие графики").Cells(3, 5).Value

            Label14.Text = (StTime + " " + Exl.Worksheets("Возрастающие графики").Cells(3, 5).Value.ToString() + " " _
+ Exl.Worksheets("Возрастающие графики").Cells(3, 3).Value.ToString()).ToString()
            If DataGridViewVoshodychi.Rows.Count < 2 Then
                DataGridViewVoshodychi.Rows.Add(2)
            End If

            DataGridViewVoshodychi.Item(0, 0).Value() = dt
            DataGridViewVoshodychi.Item(1, 0).Value() = Exl.Worksheets("Возрастающие графики").Cells(3, 3).Value
            DataGridViewVoshodychi.Item(2, 0).Value() = Exl.Worksheets("Возрастающие графики").Cells(3, 5).Value
            DataGridViewVoshodychi.Item(3, 0).Value() = Exl.Worksheets("Рынки скачек").Cells(32, 6).Value.Replace(" ", vbCrLf)
            DataGridViewVoshodychi.Item(4, 0).Value() = Exl.Worksheets("Рынки скачек").Cells(32, 7).Value.Replace(" ", vbCrLf)
            DataGridViewVoshodychi.Item(5, 0).Value() = Exl.Worksheets("Рынки скачек").Cells(32, 8).Value.Replace(" ", vbCrLf)
            DataGridViewVoshodychi.Item(7, 0).Value() = Exl.Worksheets("Рынки скачек").Cells(32, 10).Value.Replace(" ", vbCrLf)
            DataGridViewVoshodychi.Item(8, 0).Value() = Exl.Worksheets("Рынки скачек").Cells(32, 11).Value.Replace(" ", vbCrLf)
            DataGridViewVoshodychi.Item(9, 0).Value() = Exl.Worksheets("Рынки скачек").Cells(32, 12).Value.Replace(" ", vbCrLf)


При анализе выскакивает предупреждение 
Код

CA2000 : Microsoft.Reliability : В методе 'TestForm.GetGraph()' объект 'MyWebClient' не уничтожается во всех возможных путях исключений._
 Следует вызвать метод System.IDisposable.Dispose для объекта 'MyWebClient' до того, как все ссылки на него будут находиться_
 вне области действия.


Что надо сделать чтобы не было этого предупреждения?

Это сообщение отредактировал(а) vladd - 14.3.2012, 14:51
PM MAIL   Вверх
diadiavova
Дата 14.3.2012, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Используй блок Using в таких случаях и ничего больше не понадобится.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
vladd
Дата 14.3.2012, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 31.1.2009

Репутация: нет
Всего: нет



Ничего не получилось. То же предупреждение. 
PM MAIL   Вверх
diadiavova
Дата 14.3.2012, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



vladd, у тебя в тексте предупреждения все достаточно понятно написано. В твоем коде есть ветви, в которых объект не уничтожается, а стало быть, если код зайдет в эти ветви, то объект и не будет уничтожен. Если юзинг не помог, то причина в том, что ты сначала создаешь переменную, а потом инициируешь ее(кстати, непонятно как ты при этом юзинг туда впихиваешь, хоть бы код выложил). А вообще у тебя тут кусок кода, поэтому сказать, где именно дыра трудно, тем более, что диспоуза я тут вообще не увидел. Использование юзинга облегчает задачу, поскольку диспоуз в нем вызывается автоматически по завершении блока.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
vladd
Дата 14.3.2012, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 31.1.2009

Репутация: нет
Всего: нет



Сам код большой, но однотипный. Поэтому вот начало кода
Код

 Private Sub GetGraph()
        Dim MarketId, SelectionId As String
        Dim ImageInBytes() As Byte
        Dim dt As DateTime
        Dim StTime As String
        Dim Pos1 As Integer

        Try
            Using MyWebClient As New System.Net.WebClient '
                'MyWebClient = New System.Net.WebClient
                'Первый график
                MarketId = Exl.Worksheets("Возрастающие графики").Cells(3, 4).Value
                SelectionId = Exl.Worksheets("Возрастающие графики").Cells(3, 6).Value
                Exl.Worksheets("Рынки скачек").Cells(32, 4).Value = SelectionId
                ImageInBytes = MyWebClient..DownloadData("http://uk.site.sports.betfair.com/betting/LoadRunnerInfoChartAction.do?marketId=" & MarketId & "&selectionId=" & SelectionId & "&asianLineId=0")

                Using ImageStream As New IO.MemoryStream(ImageInBytes)
                    PictureBox1.Image = New System.Drawing.Bitmap(ImageStream)
                End Using
                ' Извлечение даты из ячейки Excel
                Dim value As Object = Exl.Worksheets("Возрастающие графики").Cells(3, 1).Value
                If Not value Is Nothing Then
                    If TypeOf value Is Double Then
                        dt = DateTime.FromOADate(CType(value, Double))
                    Else
                        DateTime.TryParse(CType(value, String), dt)
                    End If
                End If
                Pos1 = InStr(1, dt.ToString(), " ") 'пробел между датой и временем
                StTime = Mid(dt.ToString(), Pos1 + 1)        ' выделяем время

                Exl.Worksheets("Рынки скачек").Cells(32, 1).Value = dt
                Exl.Worksheets("Рынки скачек").Cells(32, 2).Value = Exl.Worksheets("Возрастающие графики").Cells(3, 3).Value
                Exl.Worksheets("Рынки скачек").Cells(32, 3).Value = Exl.Worksheets("Возрастающие графики").Cells(3, 5).Value

                Label14.Text = (StTime + " " + Exl.Worksheets("Возрастающие графики").Cells(3, 5).Value.ToString() + " " + Exl.Worksheets("Возрастающие графики").Cells(3, 3).Value.ToString()).ToString()
                If DataGridViewVoshodychi.Rows.Count < 2 Then
                    DataGridViewVoshodychi.Rows.Add(2)
                End If

                DataGridViewVoshodychi.Item(0, 0).Value() = dt
                DataGridViewVoshodychi.Item(1, 0).Value() = Exl.Worksheets("Возрастающие графики").Cells(3, 3).Value
                DataGridViewVoshodychi.Item(2, 0).Value() = Exl.Worksheets("Возрастающие графики").Cells(3, 5).Value
                DataGridViewVoshodychi.Item(3, 0).Value() = Exl.Worksheets("Рынки скачек").Cells(32, 6).Value.Replace(" ", vbCrLf)
                DataGridViewVoshodychi.Item(4, 0).Value() = Exl.Worksheets("Рынки скачек").Cells(32, 7).Value.Replace(" ", vbCrLf)
                DataGridViewVoshodychi.Item(5, 0).Value() = Exl.Worksheets("Рынки скачек").Cells(32, 8).Value.Replace(" ", vbCrLf)
                DataGridViewVoshodychi.Item(7, 0).Value() = Exl.Worksheets("Рынки скачек").Cells(32, 10).Value.Replace(" ", vbCrLf)
                DataGridViewVoshodychi.Item(8, 0).Value() = Exl.Worksheets("Рынки скачек").Cells(32, 11).Value.Replace(" ", vbCrLf)
                DataGridViewVoshodychi.Item(9, 0).Value() = Exl.Worksheets("Рынки скачек").Cells(32, 12).Value.Replace(" ", vbCrLf)

  

А это конец
Код

  MarketId = Exl.Worksheets("Убывающие графики").Cells(5, 4).Value
                SelectionId = Exl.Worksheets("Убывающие графики").Cells(5, 6).Value
                Exl.Worksheets("Рынки скачек").Cells(42, 4).Value = SelectionId
                ImageInBytes = MyWebClient.DownloadData("http://uk.site.sports.betfair.com/betting/LoadRunnerInfoChartAction.do?marketId=" & MarketId & "&selectionId=" & SelectionId & "&asianLineId=0")
                MyWebClient.Dispose()
                Using ImageStream = New IO.MemoryStream(ImageInBytes)
                    PictureBox9.Image = New System.Drawing.Bitmap(ImageStream)
                End Using
                value = Exl.Worksheets("Убывающие графики").Cells(5, 1).Value
                If Not value Is Nothing Then
                    If TypeOf value Is Double Then
                        dt = DateTime.FromOADate(CType(value, Double))
                    Else
                        DateTime.TryParse(CType(value, String), dt)
                    End If
                End If
                Pos1 = InStr(1, dt.ToString(), " ") 'пробел между датой и временем
                StTime = Mid(dt.ToString(), Pos1 + 1)        ' выделяем время

                Exl.Worksheets("Рынки скачек").Cells(42, 1).Value = dt
                Exl.Worksheets("Рынки скачек").Cells(42, 2).Value = Exl.Worksheets("Убывающие графики").Cells(5, 3).Value
                Exl.Worksheets("Рынки скачек").Cells(42, 3).Value = Exl.Worksheets("Убывающие графики").Cells(5, 5).Value

                Label22.Text = StTime + " " + Exl.Worksheets("Убывающие графики").Cells(5, 5).Value.ToString() + " " + Exl.Worksheets("Убывающие графики").Cells(5, 3).Value.ToString()
                DataGridViewUbivauchi.Item(0, 2).Value() = dt
                DataGridViewUbivauchi.Item(1, 2).Value() = Exl.Worksheets("Убывающие графики").Cells(5, 3).Value
                DataGridViewUbivauchi.Item(2, 2).Value() = Exl.Worksheets("Убывающие графики").Cells(5, 5).Value
                DataGridViewUbivauchi.Item(3, 2).Value() = Exl.Worksheets("Рынки скачек").Cells(42, 6).Value.Replace(" ", vbCrLf)
                DataGridViewUbivauchi.Item(4, 2).Value() = Exl.Worksheets("Рынки скачек").Cells(42, 7).Value.Replace(" ", vbCrLf)
                DataGridViewUbivauchi.Item(5, 2).Value() = Exl.Worksheets("Рынки скачек").Cells(42, 8).Value.Replace(" ", vbCrLf)
                DataGridViewUbivauchi.Item(7, 2).Value() = Exl.Worksheets("Рынки скачек").Cells(42, 10).Value.Replace(" ", vbCrLf)
                DataGridViewUbivauchi.Item(8, 2).Value() = Exl.Worksheets("Рынки скачек").Cells(42, 11).Value.Replace(" ", vbCrLf)
                DataGridViewUbivauchi.Item(9, 2).Value() = Exl.Worksheets("Рынки скачек").Cells(42, 12).Value.Replace(" ", vbCrLf)
                DataGridViewUbivauchi.AutoResizeRows(DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders) 'Автоподбор высоты строки
                DataGridViewUbivauchi.RowTemplate.Height = 35
            End Using
            
        Finally
            

        End Try

    End Sub

Dispose пробовал. Кстати осталось еще вот Try Finaly End try. Таких кусков 9 штук. В каждом из них используется MyWebClient
PM MAIL   Вверх
diadiavova
Дата 14.3.2012, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



Цитата(vladd @  14.3.2012,  18:41 Найти цитируемый пост)
 В каждом из них используется MyWebClient 

Если объект создается юзингами, то этой проблемы не будет. 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
vladd
Дата 15.3.2012, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 31.1.2009

Репутация: нет
Всего: нет



Обьект я создал один раз через Using, а использую его 9 раз. Достаточно одного раза Using. Или надо перед каждым использованием обьявлять его через Using.  
PM MAIL   Вверх
diadiavova
Дата 15.3.2012, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



vladd, у тебя проблема скорей всего в том, что ты создаешь объект внутри блока трай и если вылетает исключение, то до диспоуза дело просто не дойдет и объект останется в памяти. То есть надо либо трай разместить внутри юзинга, либо объявить переменную до трая и вызывать диспоуз не только в блоке трай, но и во всех блоках перехвата. Последний вариант более громоздкий, но какой выбрать - уже от конкретных обстоятельств зависит.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.2039 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.