powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проблемка с многопоточностью
13 сообщений из 13, страница 1 из 1
Проблемка с многопоточностью
    #38264760
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть длл, есть там функция, которая долго работает.
В паре мест я распаралелил работу, типа:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 Thread laserThread = new Thread((ThreadStart)delegate
                    {
                        try
                        {
                            laserResult = CreateLaser(param1, param2);
                        }
#if DEBUG
                        catch (Exception ex)
                        {
                            throw ex;
                        }
#endif
                        finally
                        {
                            mre.Set();
                        }
                    });
                laserThread .Start();

                RectangleList rectangles = new RectangleList(DetectLaserRectangles(param3));
                mre.WaitOne();
                mre.Reset();



И все хорошо, пока не запускать паралельно сию функцию через Task.Factory.StartNew(() => Parallel.For итд
Хотя изначально проект и не задумывался как поддерживающий многопоточность, слишком уж сложен.

Побегав в отладке как понимаю mre.Set() выполняется одним внешним потоком, когда первый внешний еще не прошел функцию CreateLaser.
Ну и дальше NullReferenceException на laserResult.

Как бы тут разобраться ?
...
Рейтинг: 0 / 0
Проблемка с многопоточностью
    #38264786
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tual, что именно ты запускаешь через Task и Parellel.For? Зачем ты смешиваешь явное создание потоков с методами TPL (Task Parallel Library)? С какой целью тебе нужна многопоточность?
...
Рейтинг: 0 / 0
Проблемка с многопоточностью
    #38264796
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это запускаю не я, это юзер на нет4
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  Task.Factory.StartNew(
                    () =>
                        {
                            Parallel.For(0,
                                         items.Count,
                                         i =>
                                             {
                                                 var reader = new MyReader(items[i]);
                                                 reader.Read();
                                                reader.Close();
                                             });



Тот код что я привел в предыдущем посте, тот код внутренний, он должен поддерживать нет2 и выше.
Поэтому такие разные подходы.
...
Рейтинг: 0 / 0
Проблемка с многопоточностью
    #38264844
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tual,

1. убрать Task.Factory.StartNew
2. оставить Parallel.For( ... )
3. покажите код, где объявлен ManualResetEvent.
...
Рейтинг: 0 / 0
Проблемка с многопоточностью
    #38264855
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эм, а какой код показывать ?
Это кусочек из конструктора внутреннего объекта (internal class).
Общая суть в том, что в потоке laserThread и основном потоке должны паралельно отработать 2 функции, а в дальнейшем (после mre.Reset()) их результаты сложиться и дальше уже не важно.
Относительно потока я весь код показал.

private static ManualResetEvent mre = new ManualResetEvent(false);
...
Рейтинг: 0 / 0
Проблемка с многопоточностью
    #38264858
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изза static чтоли весь сыр бор ?
...
Рейтинг: 0 / 0
Проблемка с многопоточностью
    #38264867
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tual,

погодите, для Task есть метод WaitAll() (ну может в названии ошибся).
Если вы создаете поток и просто его ждете для этого есть просто thread.Join().
...
Рейтинг: 0 / 0
Проблемка с многопоточностью
    #38264872
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не путайте код net4 (код юзера)
и мой (net2)

юзер всего лишь вызывает длл.

То есть если можно другим кодом юзера безопасно вызвать мою функцию из длл, это одно.
Но раз можно вызвать так, что сломается, то мне желательно найти где и как что починить.
...
Рейтинг: 0 / 0
Проблемка с многопоточностью
    #38264909
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну судя по всему именно из-за статика.
...
Рейтинг: 0 / 0
Проблемка с многопоточностью
    #38264971
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tual,

а зачем кстати статиком делали ее? Если будет более 1 экземляра вашего класса?
...
Рейтинг: 0 / 0
Проблемка с многопоточностью
    #38264996
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм, да тупо ошибка.

Как раз юзеру доводится о том, что код в длл не является потокобезопасным (проще сказать, это не является целью проекта).
То есть юзер какбы сам дурак, но починить все равно надо :)
...
Рейтинг: 0 / 0
Проблемка с многопоточностью
    #38265132
netivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tual,

вызов юзера в любом случае неправильный.
...
Рейтинг: 0 / 0
Проблемка с многопоточностью
    #38265216
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напиши сначала синхронный код, а потом сделай рефакторинг во многопоточный. Любое применение дополнительных потоков должно быть оправдано.
Этот код вообще непонятный:
Код: c#
1.
2.
3.
mre.WaitOne(); //Говоришь, жди сигнала от другого потока
…………………… //Тут следовало бы что-то выполнить, иначе к чему это декларации
mre.Reset(); //Отменить очередь потоков, ну и отменял бы в сигнальном потоке
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проблемка с многопоточностью
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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