Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизИсключения, события и потокобезопасность. Найти похожие ветки
← →
Курдль © (2006-09-18 09:58) [0]Добрый денек, коллеги!
Испытываю трудности с простым кодом, который приведен ниже.
Код- схематичный, т.е. не важно, статические эти классы и методы, как вызываются и чем занимаются. Обычно этот код не вызывает проблем.
Однако, ксли выполнять метод Boo() в отдельном потоке, throw выполняется бесконечно... Я даже в дебаггере не могу отследить, куда уходит программа. Почти так же обстоят дела с порожденными в нем событиями.class A
{
Boo()
{
try
{
B.Nothing();
}
catch
{
throw;
}
}
}
class B
{
public Nothing()
{
throw new Exception();
}
}
← →
Ехидна (2006-09-18 12:09) [1]А это какой язык ?
← →
Сергей М. © (2006-09-18 12:14) [2]Оберни тело поточной ф-ции в try..catch
← →
Карелин Артем © (2006-09-18 12:18) [3]
> Ехидна (18.09.06 12:09) [1]
Шарп видимо
← →
Курдль © (2006-09-18 12:18) [4]
> Ехидна (18.09.06 12:09) [1]
> А это какой язык ?
C#
> Сергей М. © (18.09.06 12:14) [2]
> Оберни тело поточной ф-ции в try..catch
А у меня Boo() - и есть поточная функция.
Вместо Nothing() из примера, она вызывает обращение к серверу приложений. Если сервер отключен и т.п., должно корректно обработаться исключение типа SocketError.
← →
Сергей М. © (2006-09-18 12:20) [5]
> у меня Boo() - и есть поточная функция.
Это не поточная функция. Это просто некий метод некоего класса.
← →
Курдль © (2006-09-18 12:21) [6]
> Сергей М. © (18.09.06 12:20) [5]
> Это не поточная функция. Это просто некий метод некоего
> класса.
Ок! Это метод класса А, вызываемый в потоке. Напр. таймером.
← →
Сергей М. © (2006-09-18 12:24) [7]ну так вот в том самом потоке должен быть предусмотрен "глобальный" (для данного потока) перехват всех исключений, в т.ч. тех которых ты выбрасываешь по throw
← →
Курдль © (2006-09-18 12:32) [8]
> Сергей М. © (18.09.06 12:24) [7]
> ну так вот в том самом потоке должен быть предусмотрен "глобальный"
> (для данного потока) перехват всех исключений
В каком месте? В теле таймера?
Не затруднит ткнуть в то место, где в типовом примере можно обработать исключения? А то я туплю :(
public class Timer2
{
public static void Main()
{
// Create a new Timer with Interval set to 10 seconds.
System.Timers.Timer aTimer = new System.Timers.Timer(10000);
aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
// Only raise the event the first time Interval elapses.
aTimer.AutoReset = false;
aTimer.Enabled = true;
Console.WriteLine("Press \"q\" to quit the sample.");
while(Console.Read()!="q");
}
// Specify what you want to happen when the event is raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
Console.WriteLine("Hello World!");
}
}
← →
Сергей М. © (2006-09-18 12:44) [9]Покажи как ты страртуешь поток ..
← →
Курдль © (2006-09-18 12:48) [10]
> Сергей М. © (18.09.06 12:44) [9]
> Покажи как ты страртуешь поток ..
Дык таймер - и есть поток!!! :)System.Timers.Timer aTimer = new System.Timers.Timer(10000);
← →
Сергей М. © (2006-09-18 12:57) [11]
> таймер - и есть поток!
Таймер - это не поток.
← →
Курдль © (2006-09-18 13:13) [12]
> Сергей М. © (18.09.06 12:57) [11]
> Таймер - это не поток.
Ок! Таймер создает отдельный поток, который подсчитывает интервалы времени. По достижению указанного числа таких интервалов, таймер вызывает метод, согласно делегата. Таймер работает абсолютно так же, как любой асинхронный механизм - получает точку соприкосновения с основной программой (вызывающим потоком) в виде Callback метода. Точнее, в виде делегата.
← →
Сергей М. © (2006-09-18 13:21) [13]
> Таймер создает отдельный поток
Покакзывай как твой таймер создает отдельный поток ...
← →
Eraser © (2006-09-18 13:34) [14]> [13] Сергей М. © (18.09.06 13:21)
наверное что-то вроде тогоpublic class Timer1
{
public static void Main()
{
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
// Set the Interval to 5 seconds.
aTimer.Interval=5000;
aTimer.Enabled=true;
Console.WriteLine("Press \"q\" to quit the sample.");
while(Console.Read()!="q");
}
// Specify what you want to happen when the Elapsed event is raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
Console.WriteLine("Hello World!");
}
}
← →
Сергей М. © (2006-09-18 13:39) [15]
> Eraser © (18.09.06 13:34) [14]
И где здесь создание потока ?
← →
Eraser © (2006-09-18 13:40) [16]> [15] Сергей М. © (18.09.06 13:39)
Note The event-handling method might be called even after the Stop method is called. The Timer component is multithreaded to ensure more accuracy. However, this means that the call to the event-handling method might run on one thread at the same time that a call to the Stop method runs on another thread. This might result in the Elapsed event being raised even after the Stop method is called. To prevent this, use the SignalTime property to compare the time the event was raised to the time the Stop method was called. If the event was raised after the Stop method was called, do not process the event.
← →
Сергей М. © (2006-09-18 13:48) [17]
> Eraser © (18.09.06 13:40) [16]
Теперь понятно.
Тогда все еще проще:
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
try
{
.. все что угодно
}
catch
{
.. все что угодно, но никаких неперехваченных throw !
}
}
← →
Evgeny V © (2006-09-18 13:59) [18]Мое мнение - исключение в другом потоке надо перехватывать, если его надо передать в поток главного окна, его надо именно Передать каким-либо методом, а не возбудить.. тут же. Помнится на эту именно тему - передача Exception в основной поток была ветка на RSDN в форуме .NET, кстати там же было много веток и по проблеме Events и callback
Страницы: 1 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.042 c