[C#] Потоки

Тема в разделе ".NET", создана пользователем PeRsoNaliTy, 2 окт 2013.

  1. PeRsoNaliTy

    PeRsoNaliTy Постоялец

    Регистр.:
    5 фев 2009
    Сообщения:
    79
    Симпатии:
    9
    Добрый вечер.
    Пытаюсь разобраться с потоками и не могу отловить окончание выполнения метода потоком.
    Например, у меня есть метод который считает сумму массива на заданном интервале. Запускаю несколько поток и они считают полностью массив и в конце все результаты складываются и должны быть выведены. Но как отловить, что поток полностью посчитал заданный интервал.
     
  2. artcosmic

    artcosmic

    Регистр.:
    16 сен 2008
    Сообщения:
    198
    Симпатии:
    161
    Можно использовать manualresetevent.
    Сначала устанавливается, например mre = manualresetevent(false);
    запускаются все потоки
    потом, когда нужные действия в потоках выполнены, делается mre.set
     
    Benjamin Coleman нравится это.
  3. artcosmic

    artcosmic

    Регистр.:
    16 сен 2008
    Сообщения:
    198
    Симпатии:
    161
    Код:
    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
    вот как-то так на бейсике
     
  4. sparsame

    sparsame Постоялец

    Регистр.:
    20 авг 2011
    Сообщения:
    85
    Симпатии:
    10
    Прочитай первую половину книги Гради Буча "Объектно-ориентированное программирование с примерами приложений". Во-первых чтение никогда не было вредным, во-вторых если у тебя будет допустим 1000 потоков с очень большими массивами, то очень тяжело будет разрабатывать из отлаживать это все без тестов
     
    artcosmic нравится это.
  5. artcosmic

    artcosmic

    Регистр.:
    16 сен 2008
    Сообщения:
    198
    Симпатии:
    161
  6. ilizunov

    ilizunov Писатель

    Регистр.:
    24 ноя 2011
    Сообщения:
    2
    Симпатии:
    0
    Вообще, если постановка именно просчета массива, то есть более адекватные способы - Parallel.For или Parallel.ForEach
    С потоками нужно либо читать книжку, как советует artcosmic, либо НЕ использовать их [напрямую], ограничившись безопасными обертками.
     
  7. artcosmic

    artcosmic

    Регистр.:
    16 сен 2008
    Сообщения:
    198
    Симпатии:
    161
    Вообще, пора отказываться от потоков и переходить на асинхронный код (async, await). Выполняется быстрее, требует меньше ресурсов, писать проще.
    Неплохая книга встретилась мне тут - 100 страниц, воды почти нет, все по делу.
     
    lungsmoney и ShoxMaster нравится это.
  8. mefish

    mefish Support

    Moderator
    • Супермодератор
    Регистр.:
    30 авг 2007
    Сообщения:
    886
    Симпатии:
    629
    Заранее извиняюсь за офтоп. Юзаю софт один, чекер, при любом кол-ве потоко при любом кол-ве прокси, софт проходит базу от 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. Софт крашится походу только у меня, гугл сказал что народ не жалуется.
     
  9. Цукер

    Цукер Сам себе призедент

    Moderator
    Регистр.:
    5 мар 2008
    Сообщения:
    414
    Симпатии:
    375
    Если нет исходников то не как не решиш.
    Тут по ошибке видно что сама реализация многопоточности "подгуляла" .
    Вот решение- http://social.msdn.microsoft.com/Fo...his-object-because-a-different-thread-owns-it
     
    mefish нравится это.
  10. artcosmic

    artcosmic

    Регистр.:
    16 сен 2008
    Сообщения:
    198
    Симпатии:
    161
    VerifyAccess(), возможно, говорит о том, что программе не хватает прав на запуск. Попробуй запустить с правами админа.