Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2

Исключения из другого потока выполнения

27.05.2014, 22:23. Показов 1793. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех.
Кратко суть задачи и что меня подвигло.
Делал свою программу, большая часть кода которой работает в отдельных потоках. И появился вопрос: как контролировать корректность работы в потоке? Изначально делал это через события, но во первых, все предусмотреть невозможно, поэтому обрабатывал только то, что мог предусмотреть, и во вторых, событий получалось много, и к каждому, естественно, на стороне вызывающего кода приходилось писать обработчик.
В качестве выхода нашел вот такое решение, которое и оформил в виде небольшого шаблона. Он, естественно, не идеален, но основные преимущества:
1. точная идентификация исключения (то, что было предусмотрено и вызвано мной или какое-то другое);
2. отсутствие множества событий и как следствие-множества обработчиков для них.
Ну вот как-то так. Надеюсь, что с подсказками более опытных коллег смогу улучшить совю реализацию данного шаблона.

Сам класс, в котором код выполняется в отдельном потоке:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
namespace ThreadsExceptionsPattern
{
    //Тестовый класс
    /*Данный шаблон предназначен для контроля возникновения исключений в отдельном потоке выполнения
    * с возможностью точной идентификации, что вызвало исключение-код, исполняющийся в потоке либо что-то еще
    * и сообщение об этом вызывающему коду*/
    public class TestClass
    {
        public event EventHandler<MyExceptionlEventArgs> exceptionEvent;//Событие для исключения
        private bool doEx = false;//Переменная для указания, следует ли вызвать исключение
 
        
        //public метод для создания и запуска потока
        public void RunMethod(bool throwEx)
        {
            doEx = throwEx;
            Thread t = new Thread(new ThreadStart(RunThread));
            t.IsBackground = true;
            t.Start();
        }
 
        //private метод (цель делегата потока)
        private void RunThread()
        {
            try
            {
                /*Тут код, который может вызвать
                 * какое-либо исключение
                 * (как предусмотренное, так и не предусмотренное)*/
                for (int i = 0; i < 100; i++)
                {
                    Thread.Sleep(100);
                    if (i == 5 && doEx)
                    {
                        MyException ex = new MyException("We got some error", "Error");
                        ex.HelpLink = "http://www.mycompany.com";
                        throw ex;
                    }
                }
            }
            catch (Exception ex)//Обработка исключений
            {
                string Message = ex.Message;
                string Caption = string.Empty;
                string Link = ex.HelpLink;
 
                if (ex is MyException)
                {
                    Caption = ((MyException)ex).Caption;
                }
                else
                {
                    Caption = "Error!";
                }
                if (exceptionEvent != null)
                    exceptionEvent(this, new MyExceptionlEventArgs(Message, Caption, Link));
            }
            finally
            {
                //Тут освобождаем к-либо ресурсы(если необходимо)
            }
        }
    }
    //Класс аргумента события
    public class MyExceptionlEventArgs : EventArgs
    {
        public string Message { get; private set; }
        public string Caption { get; private set; }
        public string Link { get; private set; }
 
        public MyExceptionlEventArgs(string msg)
            : this(msg, "", "") { }
        public MyExceptionlEventArgs(string msg, string cap)
            : this(msg, cap, "") { }
        public MyExceptionlEventArgs(string msg,string cap,string lnk)
        {
            Message = msg;
            Caption = cap;
            Link = lnk;
        }
    }
    //Класс исключения
    public class MyException : ApplicationException
    {
        public string Caption { get; private set; }
        public MyException(string msg, string cap)
            : base(msg)
        {
            Caption = cap;
        }
    }
}
Ну и проверка в консоли (хотя можно и в форме, не принципиально):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
 
namespace ThreadsExceptionsPattern
{
   
    class Program
    {
        static void Main(string[] args)
        {
            TestClass test = new TestClass();
            test.exceptionEvent += (s, e) =>
                {
                    Console.WriteLine("Message: {0}\nCaption: {1}\nHelplink: {2}",
                                      e.Message, e.Caption, e.Link);
                };
            test.RunMethod(true);
            Console.ReadLine();
        }
    }
}
Спасибо за внимание.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.05.2014, 22:23
Ответы с готовыми решениями:

По нажатию на кнопку из другого потока, нужно чтобы 2 потока останавливались
Есть 2 потока, в которых в цикле выполняется метод Thread.sleep(200); По нажатию на кнопку из другого потока, нужно чтобы эти 2 потока...

Как из одного потока узнать состояние другого потока
Подскажите пожалуйста, как из одного потока узнать, что другой поток еще не запущен. Например, второй поток формируется в классе...

Вызывть метод одного потока из другого потока
Здравствуйте, подскажите пожалуйста, как можно реализовать такую штуку : есть один поток(1), который вызывает метод у обьекта, этот...

1
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
28.05.2014, 17:03
Есть предложение для повышения универсальности передавать метод RunThread() в класс.
C#
1
2
3
4
5
6
7
8
9
public class TestClass
{
    public Action InnerMethod { set; get; }
 
    public TestClass(Action meth) {
        InnerMethod = meth;
    }
    // ...
}
Может быть ещё возникнут идеи - я предлагаю стремиться в данном случае к такому коду, который, в идеале, вообще не надо изменять - передать нужные методы, может появятся параметры типа и он перейдёт в обобщённый.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.05.2014, 17:03
Помогаю со студенческими работами здесь

Управление объектами потока из другого потока
Доброго времени. Есть два потока, один GUI, второй рабочий - делает снапшоты открытых окон, сравнивает их, передаёт потоку GUI...

Исключения из потока
Подскажите пожайлуста, как поймать исключение из потока? Структура программы приблизительно такая: int main() { try { ...

Прекращение выполнения программы при обработке исключения
Всем привет. Возник такой момент - в программе зачастую необходимо отлавливать исключения и обрабатывать их. При этом при пойманном...

Кнопка из другого потока
В одном потоке создается окно, и его hwnd записывается в глобальную переменную, а потом из другого потока я пытаюсь добавить кнопку, но...

Обновление UI из другого потока
Всем доброго дня! Столкнулся с казалось бы простой, но невыполнимой для меня задачей. Есть некая форма, в которой по нажатию кнопки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru