Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проблемка с многопоточностью / 13 сообщений из 13, страница 1 из 1
20.05.2013, 16:12
    #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
20.05.2013, 16:27
    #38264786
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемка с многопоточностью
tual, что именно ты запускаешь через Task и Parellel.For? Зачем ты смешиваешь явное создание потоков с методами TPL (Task Parallel Library)? С какой целью тебе нужна многопоточность?
...
Рейтинг: 0 / 0
20.05.2013, 16:33
    #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
20.05.2013, 16:53
    #38264844
netivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблемка с многопоточностью
tual,

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

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

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

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

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

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

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

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


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