[C#] Потоки

PeRsoNaliTy

Постоялец
Регистрация
5 Фев 2009
Сообщения
82
Реакции
9
Добрый вечер.
Пытаюсь разобраться с потоками и не могу отловить окончание выполнения метода потоком.
Например, у меня есть метод который считает сумму массива на заданном интервале. Запускаю несколько поток и они считают полностью массив и в конце все результаты складываются и должны быть выведены. Но как отловить, что поток полностью посчитал заданный интервал.
 
Можно использовать manualresetevent.
Сначала устанавливается, например mre = manualresetevent(false);
запускаются все потоки
потом, когда нужные действия в потоках выполнены, делается mre.set
 
Код:
re = New ManualResetEvent(False)

For i = 0 To threads_count- 1
Dim t As New Thread(New ParameterizedThreadStart(AddressOf DoSomething))
t.IsBackground = True
t.Start(i)
Next

re.WaitOne()

....

Sub DoSometing
While True
If parse=false Then
re.Set()
End If
End While
End Sub

вот как-то так на бейсике
 
Прочитай первую половину книги Гради Буча Для просмотра ссылки Войди или Зарегистрируйся. Во-первых чтение никогда не было вредным, во-вторых если у тебя будет допустим 1000 потоков с очень большими массивами, то очень тяжело будет разрабатывать из отлаживать это все без тестов
 
Вообще, если постановка именно просчета массива, то есть более адекватные способы - Для просмотра ссылки Войди или Зарегистрируйся или Parallel.ForEach
С потоками нужно либо читать книжку, как советует artcosmic, либо НЕ использовать их [напрямую], ограничившись безопасными обертками.
 
Вообще, пора отказываться от потоков и переходить на асинхронный код (async, await). Выполняется быстрее, требует меньше ресурсов, писать проще.
Неплохая книга встретилась мне Для просмотра ссылки Войди или Зарегистрируйся - 100 страниц, воды почти нет, все по делу.
 
Заранее извиняюсь за офтоп. Юзаю софт один, чекер, при любом кол-ве потоко при любом кол-ве прокси, софт проходит базу от 8 до 15к ,по времени, работает около 10 минут и постоянно вываливается в лог критикал:

Код:
System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
  at System.Windows.Threading.Dispatcher.VerifyAccess()
  at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
  at (<>c__DisplayClasse , Object , EventArgs )
  at All_In_One_Checker.Program.GetProxy.<>c__DisplayClasse.<Parse>b__a(Object s, EventArgs a)
  at xNet.Threading.MultiThreading.OnWorkCompleted(EventArgs e)
  at xNet.Threading.MultiThreading.EndWorkCallback(Object param)
  at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
  at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
  at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
  at System.Threading.ThreadPoolWorkQueue.Dispatch()
  at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

Кто что подскажет ? Использую win7. Софт крашится походу только у меня, гугл сказал что народ не жалуется.
 
Заранее извиняюсь за офтоп. Юзаю софт один, чекер, при любом кол-ве потоко при любом кол-ве прокси, софт проходит базу от 8 до 15к ,по времени, работает около 10 минут и постоянно вываливается в лог критикал:

Код:
System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
  at System.Windows.Threading.Dispatcher.VerifyAccess()
  at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
  at (<>c__DisplayClasse , Object , EventArgs )
  at All_In_One_Checker.Program.GetProxy.<>c__DisplayClasse.<Parse>b__a(Object s, EventArgs a)
  at xNet.Threading.MultiThreading.OnWorkCompleted(EventArgs e)
  at xNet.Threading.MultiThreading.EndWorkCallback(Object param)
  at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
  at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
  at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
  at System.Threading.ThreadPoolWorkQueue.Dispatch()
  at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

Кто что подскажет ? Использую win7. Софт крашится походу только у меня, гугл сказал что народ не жалуется.
Если нет исходников то не как не решиш.
Тут по ошибке видно что сама реализация многопоточности "подгуляла" .
Вот решение- Для просмотра ссылки Войди или Зарегистрируйся
 
VerifyAccess(), возможно, говорит о том, что программе не хватает прав на запуск. Попробуй запустить с правами админа.
 
Назад
Сверху