Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Событие из потока без задержки / 24 сообщений из 24, страница 1 из 1
19.03.2014, 21:29
    #38591246
Алексей Ку.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
Добрый день, мудрецы!

Задача такая:
Тривиально: есть статичный класс. В нём есть статичный метод который что-то там долго считает в отдельном потоке и докладывает о своём прогрессе. Сделал такую штуку:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public static event Action Changed;

   private static void test()
        {
            for (int i = 0; i < 10; i++)
            {
                Changed(i);
            }
        }
   public static void Upload()//SqlConnection connection)
        {

            //if(connection.State != ConnectionState.Open)
            //    connection.Open();

            Thread thr;
            thr = new Thread(test);
            thr.Start();



Запускаю вот так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FileCarrier.Changed += OnProgressChange;
            //FileCarrier.ReportDDProgress += OnProgressChange;
            FileCarrier.Upload();
            
        }

        private void OnProgressChange(int a)
        {
            MessageBox.Show(a.ToString());
        }
    }



Когда у меня срабатывает событие, то поток блокируется пока оно не будет обработано, т.е. пока не закончит выполнение метод OnProgressChange().

Вопрос: Как избежать остановки потока? Моему потоку должно быть по фигу как его событие было обработано. Он дёрнул event передав прогресс и продолжил работу.

Какое решение тут будет верным?
...
Рейтинг: 0 / 0
20.03.2014, 00:26
    #38591317
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
Алексей Ку.,
тут надо просто ответить в каком потоке выполнится код OnProgressChange................
...
Рейтинг: 0 / 0
20.03.2014, 07:37
    #38591404
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
Алексей Ку.,

Может каким нибудь BeginInvoke райзить событие
...
Рейтинг: 0 / 0
20.03.2014, 09:20
    #38591443
Алексей Ку.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
После того, как разместил пост до меня и дошло что OnProgressChange выполняется в потоке статичного метода. ПОтому он и тормозит.
Как я понял есть два решения:
1) Выполнить этот метод в контексте основного потока (какими средствами это делается?)
2) Создать отдельный поток для выполнения ивента

Вопрос: Что правильнее?
...
Рейтинг: 0 / 0
20.03.2014, 09:40
    #38591463
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
Алексей Ку.,

1. Inkove
...
Рейтинг: 0 / 0
20.03.2014, 09:41
    #38591465
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
Мнэээ, invoke
...
Рейтинг: 0 / 0
20.03.2014, 11:36
    #38591611
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
PallarisInkoveBeginInvoke.
...
Рейтинг: 0 / 0
20.03.2014, 12:13
    #38591655
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
Алексей К,
Вообще то это не эстетично, можно конечно и ибать козу с рогами но не эстетично, ведь первым аргументом у делегата идет
sender, что там может быть - с ним в разных потоках одному богу известно, начиная от борьбы кончая : извините тут два стояло только что.
Есть же масса вариантов кроме событий - выстрелил и забыл..
...
Рейтинг: 0 / 0
20.03.2014, 12:31
    #38591686
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
   public static event Action<int> Changed;

        private static void test()
        {
            for (int i = 0; i < 10; i++)
            {
                if (Changed != null)
                {
                    Changed.BeginInvoke(i, async => 
                    {
                        Changed.EndInvoke(async);
                    }, null);                    
                }
            }
        }
...
Рейтинг: 0 / 0
20.03.2014, 12:53
    #38591727
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
Где-то в степиАлексей К,
Вообще то это не эстетично, можно конечно и ибать козу с рогами но не эстетично, ведь первым аргументом у делегата идет
sender, что там может быть - с ним в разных потоках одному богу известно, начиная от борьбы кончая : извините тут два стояло только что.
Есть же масса вариантов кроме событий - выстрелил и забыл..Я не знаю что там с событиями. Я про синхронизацию с UI-потоком через Control.BeginInvoke.
...
Рейтинг: 0 / 0
20.03.2014, 12:56
    #38591731
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
Где-то в степиЕсть же масса вариантов кроме событий - выстрелил и забыл.. Оно?
...
Рейтинг: 0 / 0
20.03.2014, 12:57
    #38591735
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
Алексей КЯ не знаю что там с событиями. Я про синхронизацию с UI-потоком через Control.BeginInvoke.

Через Control.BeginInvoke оно в данном случае покажет первый MessageBox и будет ждать нажатия "ОК" и после этого покажет следующий? Без блокирования вторичного потока-вычислителя, разумеется.
...
Рейтинг: 0 / 0
20.03.2014, 13:06
    #38591749
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
PallarisАлексей КЯ не знаю что там с событиями. Я про синхронизацию с UI-потоком через Control.BeginInvoke.

Через Control.BeginInvoke оно в данном случае покажет первый MessageBox и будет ждать нажатия "ОК" и после этого покажет следующий? Без блокирования вторичного потока-вычислителя, разумеется.Так тогда вообще через async/await лучше делать. Можно и через "голый" Task, но сложнее...
...
Рейтинг: 0 / 0
20.03.2014, 13:11
    #38591758
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
...
Рейтинг: 0 / 0
20.03.2014, 13:33
    #38591803
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
Алексей КТак тогда вообще через async/await лучше делать. Можно и через "голый" Task, но сложнее...

Ага, ЕвгенийВ выше написал
...
Рейтинг: 0 / 0
20.03.2014, 14:32
    #38591903
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
PallarisАлексей КТак тогда вообще через async/await лучше делать. Можно и через "голый" Task, но сложнее...

Ага, ЕвгенийВ выше написал
В моем примере компилятор, будет трактовать
Код: c#
1.
async

, как обычный идентификатор.
...
Рейтинг: 0 / 0
20.03.2014, 17:59
    #38592205
DontAskMe
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
ЕвгенийВ,

Есть класс BackgroundWorker - помогает делать асинхронные вызовы в WinForms.
...
Рейтинг: 0 / 0
21.03.2014, 01:24
    #38592470
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
DontAskMeЕвгенийВ,

Есть класс BackgroundWorker - помогает делать асинхронные вызовы в WinForms.
Это рудимент 12+ летней давности.
...
Рейтинг: 0 / 0
23.03.2014, 13:57
    #38593922
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
ЕвгенийВDontAskMeЕвгенийВ,

Есть класс BackgroundWorker - помогает делать асинхронные вызовы в WinForms.
Это рудимент 12+ летней давности.

А вся винда - рудимент 19+ давности...
:-)

В чем причина не использовать старую (а значит быструю) дллку?
Её что, пометили к отключению?
...
Рейтинг: 0 / 0
23.03.2014, 14:21
    #38593930
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
ЕвгенийВЭто рудимент 12+ летней давности.

Может и так, но все ж не deprecated. В моих проектах, где приложение крутится сутками и в нем 3-4 BackgroundWorkera (одних и тех же) копошатся весь цикл жизни - вроде справляются со своими задачами. Или под такие условия стоит что-то другое применить? Ну, когда не одноразовую работу асинхронно выполнить, а колбасить постоянно
...
Рейтинг: 0 / 0
23.03.2014, 14:52
    #38593940
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
PallarisЕвгенийВЭто рудимент 12+ летней давности.

Может и так, но все ж не deprecated. В моих проектах, где приложение крутится сутками и в нем 3-4 BackgroundWorkera (одних и тех же) копошатся весь цикл жизни - вроде справляются со своими задачами. Или под такие условия стоит что-то другое применить? Ну, когда не одноразовую работу асинхронно выполнить, а колбасить постоянно

Скорее аргументом использовать что-то другое может быть только "политика постепенных изменений".
Ну как с Линком - постепенно вводили новый синтаксис, отучали от циклов и индексов, а потом раз! - нате вам параллелинг.
:-)

Если бы весь код был по прежнему for(...) - то от параллелинга не было бы никакого толку. Не переписывать же.
А так - технология в легкую начинает использоваться.
...
Рейтинг: 0 / 0
23.03.2014, 22:48
    #38594076
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
ЕвгенийВDontAskMeЕвгенийВ,

Есть класс BackgroundWorker - помогает делать асинхронные вызовы в WinForms.
Это рудимент 12+ летней давности.

и в чем его (обертки над Thread) рудиментарность?
Можно и самому велосипед придумать такой же, но смысл...
...
Рейтинг: 0 / 0
24.03.2014, 17:04
    #38594903
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
WinnipuhЕвгенийВпропущено...

Это рудимент 12+ летней давности.

и в чем его (обертки над Thread) рудиментарность?
Можно и самому велосипед придумать такой же, но смысл...+100500.
В конечном итоге всё сводится к Thread...
...
Рейтинг: 0 / 0
25.03.2014, 11:04
    #38595460
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Событие из потока без задержки
Alex KuznetsovВ конечном итоге всё сводится к Thread...
TPL
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Событие из потока без задержки / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]