Как зайти в Даркнет?!
25th January, 01:11
5
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Не удается получить доступ к удаленному объекту - как это исправить?
В проекте VB.NET WinForms я получаю исключение
Невозможно получить доступ к удаленному объекту
при закрытии формы. Это происходит очень редко, и я не могу воссоздать его по требованию. Стек trace выглядит следующим образом:
Cannot access a disposed object. Object name: 'dbiSchedule'.
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.Control.PointToScreen(Point p)
at Dbi.WinControl.Schedule.dbiSchedule.a(Boolean A_0)
at Dbi.WinControl.Schedule.dbiSchedule.a(Object A_0, EventArgs A_1)
at System.Windows.Forms.Timer.OnTick(EventArgs e)
at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
dbiSchedule - это управление расписанием от Dbi-tech. В форме есть таймер, который обновляет расписание на экране каждые несколько минут.
Есть идеи, что вызывает исключение и как я могу его исправить? или даже просто возможность воссоздать его по требованию?
Hej и! Спасибо за все ответы. Мы останавливаем таймер на событии FormClosing и проверяем свойство IsDisposed в компоненте расписания, прежде чем использовать его в событии Timer Tick, но это не помогает.
Это действительно раздражающая проблема, потому что если кто - то действительно придумал решение, которое сработало-я не смогу подтвердить решение, потому что я не могу воссоздать проблему вручную.
Попробуйте проверить свойство IsDisposed перед доступом к элементу управления. Вы также можете проверить его на событии FormClosing, предполагая, что вы используете событие FormClosed.
Мы действительно останавливаем таймер на FormClosing событие, и мы действительно проверяем IsDisposed недвижимость по расписанию компонент перед использованием его в таймере Тиковое событие, но это не помогает.
Вызов GC.Collect перед проверкой IsDisposed может помочь, но будьте осторожны с этим. Читайте эту статью Рико Мариани "когда звонить GC.Collect()".
Похоже на проблему с потоками.
Гипотеза: возможно, у вас есть основной поток и поток таймера, обращающийся к этому элементу управления. Основной поток завершает работу-вызывая Control.Dispose(), чтобы указать, что я закончил с этим элементом управления, и я больше не буду делать никаких вызовов к этому. Однако поток таймера все еще активен - контекстный переключатель к этому потоку, где он может вызывать методы на том же элементе управления. Теперь контроль говорит, что я избавился (уже отказался от своих ресурсов) и больше не буду работать. ObjectDisposed исключение.
Как решить эту проблему : в потоке таймера перед вызовом методов / свойств элемента управления выполните проверку с помощью
if ControlObject.IsDisposed then return; // or do whatever - but don't call control methods
OR остановите поток таймера BEFORE, избавляющийся от объекта.
мы действительно проверяем свойство IsDisposed на
компонент расписания перед его использованием
в таймере тикает событие но это не так
помощь.
мы действительно проверяем свойство IsDisposed на компонент расписания перед его использованием в таймере тикает событие но это не так помощь.
Если я правильно понимаю, что stack trace-это не ваш таймер, а проблема в самом элементе управления - это могут быть те, кто не убирает должным образом.
Вы явно вызываете Dispose на их контроль?
Остановка таймера не означает, что он не будет вызван снова, в зависимости от того, когда вы остановите таймер, timer_tick все еще может стоять в очереди в цикле сообщений для формы. Что произойдет, так это то, что вы получите еще один тик, который вы, возможно, не ожидали. То, что вы можете сделать, это в вашем timer_tick, проверьте свойство Enabled вашего таймера перед выполнением метода Timer_Tick.
У меня была та же проблема, и я решил ее с помощью логического флага, который устанавливается, когда форма закрывается (свойство System.Timers.Timer не имеет свойства IsDisposed). Везде на форме я запускал таймер, я должен был проверить этот флаг. Если он был установлен, то не запускайте таймер. Вот в чем причина:
причина:
Я останавливался и избавлялся от таймера в виде события закрытия. Я запускал таймер в событии Timer_Elapsed(). Если бы я закрыл форму в середине события Timer_Elapsed(), таймер немедленно был бы удален событием Form_Closing(). Это произойдет до того, как событие Timer_Elapsed() завершится и, что более важно, до того, как оно попадет в эту строку кода:
_timer.Start()
Как только эта строка была выполнена, ObjectDisposedException() будет брошен с ошибкой, о которой Вы упомянули.
решение:
Private Sub myForm_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
' set the form closing flag so the timer doesn't fire even after the form is closed.
_formIsClosing = True
_timer.Stop()
_timer.Dispose()
End Sub
Вот таймер прошедшего события:
Private Sub Timer_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles _timer.Elapsed
' Don't want the timer stepping on itself (ie. the time interval elapses before the first call is done processing)
_timer.Stop()
' do work here
' Only start the timer if the form is open. Without this check, the timer will run even if the form is closed.
If Not _formIsClosing Then
_timer.Interval = _refreshInterval
_timer.Start() ' ObjectDisposedException() is thrown here unless you check the _formIsClosing flag.
End If
End Sub
Интересно знать, что даже если бы он бросил ObjectDisposedException при попытке запустить таймер, таймер все равно запустился бы, заставляя его работать даже тогда, когда форма была закрыта (поток остановится только тогда, когда приложение будет закрыто).
Еще одним местом, где вы можете остановить таймер, является событие FormClosing - это происходит до того, как форма фактически закрыта, поэтому это хорошее место для остановки вещей, прежде чем они могут получить доступ к недоступным ресурсам.
Если это происходит спорадически, то я предполагаю, что это как-то связано с таймером.
Я предполагаю (и это только предположение, поскольку у меня нет доступа к вашему коду), что таймер срабатывает, когда форма закрывается. Объект dbiSchedule был удален, но таймер каким-то образом все еще пытается вызвать его. Этого не должно произойти, потому что если таймер имеет ссылку на объект расписания, то сборщик мусора должен увидеть это и не утилизировать его.
Это заставляет меня спросить: вы вызываете Dispose() на объекте расписания вручную? Если да, то делаете ли вы это перед тем, как избавиться от таймера? Убедитесь, что вы освободили все ссылки на объект расписания, прежде чем избавляться от него (т. е. избавиться от таймера заранее).
Теперь я понимаю, что прошло несколько месяцев между тем, как вы опубликовали это, и когда я отвечаю, так что, надеюсь, вы решили эту проблему. Я пишу это для пользы других людей, которые могут прийти позже с подобной проблемой.
Надеюсь, это поможет.