Исключения в потоках.
От: Аноним  
Дата: 28.06.08 13:18
Оценка:
Добрый день! Исключения возникшие в потоках нельзя перебросить за пределы потока, они должны обрабатываться в самом потоке(С#). Однако, иногда требуется оповестить внешний код о возникшем ислючении, поэтму я прибегаю к механизму кодов возврата, тем самым создается болшая неразбериха в коде — часть функций выбрасывает исключения , а часть возвращает ошибку.
Хотелось бы узнать как придать единую структуру, с точки зрения оформления кода, и какие механизмы для етого используются?
Re: Исключения в потоках.
От: Аноним  
Дата: 28.06.08 13:48
Оценка:
Здравствуйте, Аноним, Вы писали:

всё может разрулиться событиями с помощью EventArgs передавай свой ексепшн.
Re: Исключения в потоках.
От: adontz Грузия http://adontz.wordpress.com/
Дата: 28.06.08 14:12
Оценка:
Здравствуйте, Аноним, Вы писали:

Можно попытаться использовать
Thread.Abort(Object)
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Исключения в потоках.
От: _FRED_ Черногория
Дата: 28.06.08 14:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Хотелось бы узнать как придать единую структуру, с точки зрения оформления кода, и какие механизмы для етого используются?


Можно передавать в поток SynchronizationContext того потока, который следует известить об исключении.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Исключения в потоках.
От: Аноним  
Дата: 28.06.08 15:19
Оценка:
Интерессно, а можно какой- нибудь простой примерчик с использованием контекстов синхронизации, например на такой сценарий:
OnButtonClicked() // STA
{
   try
   {
      Evaluate();
   }
   catch(Exception exc)
   {
      // Мы никогда сюда не попадем (*)
   }
}
public void Evaluate() //функция обарачивает поток
{
   ThreadStart ts = delegate
   {
      try
      {
         //........
         trow new Exception();
      }
      catch(Exception exc)
      {
         // ловим исключение, о котором нужно оповестить поток из STA (*) 
      }
   };
   Thread thr = new Thread(ts);
   thr.IsBackground = true;
   thr.Start();
   thr.Join();
}
Re: Исключения в потоках.
От: vioso  
Дата: 28.06.08 16:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день! Исключения возникшие в потоках нельзя перебросить за пределы потока, они должны обрабатываться в самом потоке(С#). Однако, иногда требуется оповестить внешний код о возникшем ислючении, поэтму я прибегаю к механизму кодов возврата, тем самым создается болшая неразбериха в коде — часть функций выбрасывает исключения , а часть возвращает ошибку.

А>Хотелось бы узнать как придать единую структуру, с точки зрения оформления кода, и какие механизмы для етого используются?

Например, использовать пару:

void xxxAsync() — для запуска
event yyy xxxCompleted — вытаскивать по завершению

в параметре завести поле, где можно передавать исключение если оно возникло в процессе выполнения:

class yyy : EventArgs
{
public Exception Exception;
public object Result;
}
Re[2]: Исключения в потоках.
От: Аноним  
Дата: 28.06.08 16:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>всё может разрулиться событиями с помощью EventArgs передавай свой ексепшн.


Тот же код возврата -- вид с боку. EventArgs может не проверятся...
Re[2]: Исключения в потоках.
От: Аноним  
Дата: 28.06.08 16:40
Оценка:
Здравствуйте, vioso, Вы писали:

V>Здравствуйте, Аноним, Вы писали:


А>>Добрый день! Исключения возникшие в потоках нельзя перебросить за пределы потока, они должны обрабатываться в самом потоке(С#). Однако, иногда требуется оповестить внешний код о возникшем ислючении, поэтму я прибегаю к механизму кодов возврата, тем самым создается болшая неразбериха в коде — часть функций выбрасывает исключения , а часть возвращает ошибку.

А>>Хотелось бы узнать как придать единую структуру, с точки зрения оформления кода, и какие механизмы для етого используются?

V>Например, использовать пару:


V>void xxxAsync() — для запуска

V>event yyy xxxCompleted — вытаскивать по завершению

V>в параметре завести поле, где можно передавать исключение если оно возникло в процессе выполнения:


V>class yyy : EventArgs

V>{
V>public Exception Exception;
V>public object Result;
V>}

Да, я думал об этом, но в таком сценарии тот же недостаток, что и у кодов возврата — EventArgs может не проверятся, к тому же такой подход обязывает вызывающую сторону подписатья на событие — раз (что можно и забыть), определить Cаllback два, который в свою очередь будет исполнятся в контексте вызванного потока, что запрещает любые обращения к GUI, а перевод апартмента в STA через Invoke, незамедлительно приводит к дедлоку, если вызывающая сторона держит locк() или join(). В заключении, вызывающая сторона обязанна занать, что функция выполняется в другом потоке( а хотелось-бы прозрачно), event дожен отслеживать аппартмент(что тоже нежелательно).
Все это, ИМХО, еще больше усложняет ситуацию, требуя большей осторожности, и затрудняет сопровождение.
Re[2]: Исключения в потоках.
От: Аноним  
Дата: 28.06.08 16:50
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


Разве ThreadAbortException может делать ретроу черз границы потока?

A>Можно попытаться использовать

A>Thread.Abort(Object)
Re[3]: Исключения в потоках.
От: _FRED_ Черногория
Дата: 28.06.08 18:11
Оценка: 4 (1)
Здравствуйте, Аноним, Вы писали:

А>Интерессно, а можно какой- нибудь простой примерчик с использованием контекстов синхронизации…


private void ButtonClicked(object sender, EventArgs e) { // Обработчик события в UI
  var synchronizationContext = SynchronizationContext.Current; // "Запоминаем" контекст
  ThreadPool.QueueUserWorkItem(delegate { // асинхронно вызываем метод
    try {
      var array = Calculate(); // Некая "долгая" операция получения массива данных
      synchronizationContext.Post(delegate { // Показываем данные в потоке UI
        Combo.Items.AddRange(array);
      }, null);
    } catch(SqlException ex) { // Обработчик исключения в "рабочем" потоке
      synchronizationContext.Post(delegate { // Сообщаем об ошибке в потоке UI
        MessageProvider.SetError(Combo, ex.Message);
      }, null);
    }//try
  });
}
Help will always be given at Hogwarts to those who ask for it.
Re: Исключения в потоках.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.06.08 12:25
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Добрый день! Исключения возникшие в потоках нельзя перебросить за пределы потока, они должны обрабатываться в самом потоке(С#).


Ничего не понятно. Что такое границы потока? Как можно использовать коды возврата, если они находятся в стеке, а стек у каждого потока свой? Как может поток обрабатывать исключения из другого потока, если он (первый поток) в этот момент выполняет свой собственный код?
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[2]: Исключения в потоках.
От: Аноним  
Дата: 29.06.08 14:08
Оценка:
Ваш класс вызывает некую функцию другого класса, каторая в свою очередь, выполняет некий код в другом потоке. В этом коде возбуждается исключение. Как проинформировать Вас о произошедшем, при условии, что принемать решения о далнейших дейсвиях в связи с исключением может толко Ваш класс?
Re[3]: Исключения в потоках.
От: prVovik Россия  
Дата: 29.06.08 14:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ваш класс вызывает некую функцию другого класса, каторая в свою очередь, выполняет некий код в другом потоке. В этом коде возбуждается исключение. Как проинформировать Вас о произошедшем, при условии, что принемать решения о далнейших дейсвиях в связи с исключением может толко Ваш класс?


Значит этот "другой класс", владеющий потоком, должен перевыкинуть исключение.
лэт ми спик фром май харт
Re[3]: Исключения в потоках.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 29.06.08 14:32
Оценка: +1 -2
Здравствуйте, <Аноним>, Вы писали:

А>Ваш класс вызывает некую функцию другого класса


Мой класс???

А>, каторая в свою очередь, выполняет некий код в другом потоке. В этом коде возбуждается исключение. Как проинформировать Вас


Меня?

А> о произошедшем, при условии, что принемать решения о далнейших дейсвиях в связи с исключением может толко Ваш класс?


Опять ничего не понятно. http://rsdn.ru/Info/Howtoask.xml
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[4]: Исключения в потоках.
От: Аноним  
Дата: 30.06.08 11:58
Оценка:
Здравствуйте, prVovik, Вы писали:

И как можно перевыкинуть?
Re[4]: Исключения в потоках.
От: Аноним  
Дата: 30.06.08 12:12
Оценка: +1 :)
Здравствуйте, AndrewVK, Вы писали:

AVK>Опять ничего не понятно. http://rsdn.ru/Info/Howtoask.xml


Может Вы просто не хотите понять?
Re[5]: Исключения в потоках.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.06.08 13:22
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

AVK>>Опять ничего не понятно. http://rsdn.ru/Info/Howtoask.xml


А>Может Вы просто не хотите понять?


Правильно заданный вопрос — 90% ответа.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re: Исключения в потоках.
От: HowardLovekraft  
Дата: 30.06.08 14:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Исключения возникшие в потоках нельзя перебросить за пределы потока, они должны обрабатываться в самом потоке(С#).

Стесняюсь спросить, что тогда происходит, если исключение генерирует ремоутинг-сервер, а обрабатывает его ремоутинг-клиент?
В общем случае, это не просто "за пределы потока", это за пределы домена, процесса и машины.
Непонятно.
Re[2]: Исключения в потоках.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 30.06.08 14:12
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Стесняюсь спросить, что тогда происходит, если исключение генерирует ремоутинг-сервер, а обрабатывает его ремоутинг-клиент?

HL>В общем случае, это не просто "за пределы потока", это за пределы домена, процесса и машины.
HL>Непонятно.

Я так подозреваю, что речь все же о GUI-потоке, но вместо того, чтобы упорядочить кашу в голове, товарищь пытается искать проблемы во мне.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[2]: Исключения в потоках.
От: Аноним  
Дата: 30.06.08 15:41
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:
HL>Стесняюсь спросить, что тогда происходит, если исключение генерирует ремоутинг-сервер, а обрабатывает его ремоутинг-клиент?
HL>В общем случае, это не просто "за пределы потока", это за пределы домена, процесса и машины.
HL>Непонятно.

Я же про ремоутинг ничего не спрашивал.
Два потока в одном процессе, в одном APP домеине. В одном потоке произошло исключение, второй хочет об этом знать. О чем? О том, что в первом потоке произошло исключение. Все.

Про GUI поток, я тоже ничего не говорил. В данном случае неважно если один из этих потоков из STA или оба из МТА.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.