Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2016, 17:31   #1
Lolidze
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 48
По умолчанию Как "вытащить" из object массив ?

делаю многопоточное приложение, и в метод нужно послать несколько аргументов. В методе указал как :
Код:
  public  void start(object data)
и создаю так:
Код:
 string[] dan = null;
dan[0] = res;
      dan[1] = MessageText;

for (int i = 1; i < 3; i++)
          {
              Thread myThread = new Thread(start);
              myThread.Start(dan);
          }
как щас в методе отдельно рассмотреть res и MessageText ? подскажите пожалуйста
Lolidze вне форума Ответить с цитированием
Старый 20.08.2016, 18:52   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну ваш код вылетит с NRE
dan == null.

а так, просто заведите локальную переменную и приведите тип аргумента обратно:
Код:
var dan=(string[])data;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.08.2016, 19:33   #3
Lolidze
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 48
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну ваш код вылетит с NRE
dan == null.
почему ? можете подсказать, как сдлетаь тогда по другому ?

таки да, вылетело с ошибкой
Цитата:
Необработанное исключение типа "System.NullReferenceException" в t.exe

Дополнительные сведения: Ссылка на объект не указывает на экземпляр объекта.
показывая на строку dan[1] = MessageText;

Последний раз редактировалось Пепел Феникса; 20.08.2016 в 20:14.
Lolidze вне форума Ответить с цитированием
Старый 20.08.2016, 19:43   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

объект(в том числе массив)
было бы неплохо создать сначала.
string[] dan=new string[2];

так же помните что вы передадите ссылку на один и тот же массив, и если один из потоков изменит что в нем, то это коснется всех потоков.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.08.2016, 19:52   #5
Lolidze
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 48
По умолчанию

спасибо
т.е вот такая схема не прокатит :
Код:
        

 while (true)
  {
 if (res == null) break;
  for (int i = 1; i <3; i++)
          {
              res = fs.ReadLine();
              if (res == null) break;
              dan[0] = res;
              dan[1] = MessageText;

              Thread myThread = new Thread(start);
              myThread.Start(dan);
          }
}
по идее, один поток будет работать с 1 данными, другой с другими и т.д

хм, не катит...

Последний раз редактировалось Пепел Феникса; 20.08.2016 в 20:13.
Lolidze вне форума Ответить с цитированием
Старый 20.08.2016, 20:13   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
 while (true)
  {
  for (int i = 1; i <3; i++)
          {
              string[] dan=new string[2];
              string res = fs.ReadLine();
              if (res == null) break;
              dan[0] = res;
              dan[1] = MessageText;

              Thread myThread = new Thread(start);
              myThread.Start(dan);
          }
}
все должно работать вполне.

и пожалуйста, пользуйтесь кнопкой правка.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.08.2016, 22:29   #7
Lolidze
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 48
По умолчанию

да, спасибо

Не поскажите, как изменить этот код, чтобы работал так : одновременно не больше 2 потоков работало, после их завершения (не обязательно обоих ) начинал новый работать. Ибо щас у меня из за цикла while не дожидается окончания потока и сразу 2 новых создает.

Последний раз редактировалось Lolidze; 21.08.2016 в 01:26.
Lolidze вне форума Ответить с цитированием
Старый 21.08.2016, 11:33   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не проще тогда через таски?
path это ваш файл.
Код:
var lines=File.ReadAllLines(path);
var opt = new ParallelOptions
{
   MaxDegreeOfParallelism = 2//Лимит потоков
};
Parallel.ForEach(lines, opt, a=>start(new string[]{a,MessageText}));
тогда и ваш метод start можно переделать чтоб нормально аргументы принимал.

PS: в личку писать не обязательно
личну я проверяю не чаще форума
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 21.08.2016 в 11:43.
Пепел Феникса вне форума Ответить с цитированием
Старый 21.08.2016, 11:38   #9
Lolidze
Пользователь
 
Регистрация: 05.06.2016
Сообщений: 48
По умолчанию

спасибо, щас попробую.

п.с в личку написал т.к изначально я написал "да, спасибо" и вы возможно это раньше прочитали, а потом только на след день добавил через правку текст и тема же не обновляется

а что такое data

Последний раз редактировалось Lolidze; 21.08.2016 в 11:40.
Lolidze вне форума Ответить с цитированием
Старый 21.08.2016, 11:43   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ой, не поправил.(брал свой код изначально)

lines, там должно быть.
поправлю сча.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
[C#] Как "вытащить" значения из string? GregRUS Помощь студентам 2 12.01.2012 04:08
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
Как "вытащить" данные из 1С 7.07.1 Феска БД в Delphi 2 18.03.2009 23:39
Перечисление в столбце. Как "вытащить" нужное? Помогите! Tatyana БД в Delphi 2 10.07.2007 09:25