Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

Исключения, события и потокобезопасность.   Найти похожие ветки 

 
Курдль ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.051 c
9-1137021348
Buffer
2006-01-12 02:15
2006.10.08
GLScene Buffer Как узнать видна ли такая то точка или нет?


15-1158243464
iamdanil
2006-09-14 18:17
2006.10.08
Как сохранить ьекстовый файл на сониериксон к300?


3-1155229904
serko
2006-08-10 21:11
2006.10.08
Выбор по дате!


15-1158667458
dgim
2006-09-19 16:04
2006.10.08
Файлы....


2-1158913906
dest81
2006-09-22 12:31
2006.10.08
Выделение цифр из строки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский