С# Thread [Нужна помощь]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Ins, 26 Jul 2014.

  1. Ins

    Ins New Member

    Joined:
    21 Aug 2010
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Всем привет. Начал тут изучать потоки и что-то не пойму, почему они у меня работают не так,как надо.

    Вот мой код: http://pastebin.com/c1xh27wz
    Потоки создаются, но работают они как-то странно. Есть задача в цикле, создается 5 потоков, и пока все 5 потоков не пройдут первый шаг, первый поток не перейдёт на второй. А надо, чтобы первый поток после завершения первого шага переходил на второй и тп.

    Буду рад помощи как кодом,так и объяснениями.
     
  2. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Ну вообще есть такое как your_threa.Join();, которое заставляет подождать пока не исполниться поток. То есть если в потоке 10 заданий, то в вашем случае при заходе в цикл будет создаваться поток, после чего если добавить вышестоящее, то он дальше дело не пойдет пока он не выполнит все свои 10 операций.

    Но с другой стороны вы используете Invoke и тут могут возникнут траблы, так как Invoke отправить запрос на UI и будет ждать ответ - занавес. (поробуйте в цикле последней строчкой напистаь your_thread.Join() и увидите, что все повиснет).

    Но такое возникнет, только в том случае, если вам обязательно понадобиться обновлять GUI. Если нет - убирай Invoke и будет вам счастье.

    Вот ТУТ подобная проблематика уже поднималась, по поводу Invoke и Join(). Советую прочитать от корки до корки, в конце описано решение.

    А вообще если нужно обновлять GUI рекомендую пользоваться BackGroundWorker.

    Улачи в решении.

    P.S. На шарпе уже год как не езжу, брал из головы, возможно что то напутал.Хотя не должен.
     
    1 person likes this.
  3. Ins

    Ins New Member

    Joined:
    21 Aug 2010
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Есть такая проблема, делаю запросы на сервер, сперва главным потоком получаю куки и сохраняю их
    CookieContainer cc = new CookieContainer();
    и каждый поток при создании запроса обращается к ним.
    Если делать запрос с куками, то потоки намного медленнее работают. Почему так?
     
  4. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Вы описываете проблему весьма абстрактно - просто обращене к контейнеру с печеньками никак не будет тормозить ваши потоки. Другое дело реализация запросов.
    Так что код в студию.
     
  5. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Может при запросе с печенками сервер начинает тупить, увеличивается таймаут ожидания со всеми вытекающими. Также возможно криво сделана синхронизация при обращении к общем плюшкам, к тому же, если не делаете синхронизации доступа к CookieContainer, то CookieContainer не Thread Safe.
     
  6. Ins

    Ins New Member

    Joined:
    21 Aug 2010
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    http://pastebin.com/NXGSPrXW код тут, по рукам сильно не бить)
     
  7. TarasBulba

    TarasBulba New Member

    Joined:
    24 Feb 2011
    Messages:
    0
    Likes Received:
    2
    Reputations:
    0
    Быть может трай-кетч выбивает ошибку, и снова и снова пытается отправить запрос? трай-кетч то в while, и никаких условий для выхода из него нет.

    UPD: пересмотрел код еще раз. выход из while вообще не происходит, если я правильно понял. Надо добавить условие для выхода из цикла.
     
    #7 TarasBulba, 3 Aug 2014
    Last edited: 3 Aug 2014