Принципы работы C# многопоточности

Sample

Client
Регистрация
31.01.2016
Сообщения
25
Благодарностей
4
Баллы
3
Всем привет. Не могу все-таки понять как правильно работать с многопоточностью используя только блоки c#.
Если я все правильно понимаю, то, например, если у меня есть структура блоков действий (не только c#), то как только один из блоков заканчивает свое выполнение, поток может уступить процессорное время другому потоку.
Однако в случае работы с C# выходит так, что у меня есть куча логики в одном блоке, который не может прерываться и многопоточность не работает.
Проблема еще и в том, что я не могу даже остановить выполнение блока! Нажимая в ZennoPoster кнопку "Прервать", шаблон переходит в состояние "Закругляюсь", но доводит блок C# до конца.
В большей степени я обращал внимание именно на циклы.

Вот пример блока:
Код:
Random random = new Random();
var name = "Thread-" + random.Next(99999);
for (int i = 0; i < 10; i++)
{
    project.SendInfoToLog(name+ "!", true);
    var page = ZennoPoster.HttpGet("https://www.google.com/", "", "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 30000);
    project.SendInfoToLog(page.Length + "", true);
}
return 1;
Я так понимаю, что добавление какого-нибудь SyncObject.ListSyncer тут роли не играет.
Если я добавлю в цикл Thread.Sleep(1000); и запускаю 10 потоков, то они действительно начинают идти в параллель. Получается, что цикл - это неделимая единица для многопоточности, при условии, что мы не заставляем поток уснуть насильно? Даже если я добавляю два одинаковых проекта в Zennoposter и запускаю их в разных потоках - все-равно они выполняются по очереди, если состоят только из цикла.
И еще - даже если мы указываем Sleep, проект все-равно не может остановиться!
Соответственно вопросы:
  1. Можно ли как-то реализовать многопоточность не используя Sleep в циклах? Это похоже на вопрос конкретно по C#, но может быть есть какая-то специфика работы с ней в Zennoposter. Если нет...что ж, шлите меня в гугл.
  2. Как я могу прервать выполнение проекта в описанной выше ситуации?
  3. Если я получил значения списка через project.Lists["xxx"] и сохранил их в локальную переменную внутри блока C#, то смысла использовать SyncObject.ListSyncer нет? Его нужно использовать только когда внутри цикла идет непосредственно запись в список проекта (project.Lists["xxx"].Add(...))?

Спасибо! Искал-искал, но не нашел подобных вопросов. Если пропустил, то поделитесь ссылкой, пожалуйста.
 

Sample

Client
Регистрация
31.01.2016
Сообщения
25
Благодарностей
4
Баллы
3

gigavat

Super Moderator
Регистрация
17.11.2011
Сообщения
112
Благодарностей
88
Баллы
28
Не стоит задумываться кто кому уступает процессорное время. Поток ZennoPoster, он же инстанс, работает параллельно с остальными инстансами. Поэтому многопоточность в ZennoPoster работает честно и нормально, в том числе и с C# действиями. Но если вы в своем C# коде используете lock, например lock(SyncObject.ListSyncer), то тем самым вы создаете критическую секцию в коде, которую потоки будут вынуждены обрабатывать последовательно.
Прервать выполенение C# кода нельзя.
И если вы только читаете из списка, то можно не использовать SyncObject.ListSyncer.
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113

Sample

Client
Регистрация
31.01.2016
Сообщения
25
Благодарностей
4
Баллы
3
@gigavat, спасибо за ответ. Но вот у меня не работает сниппет, который я прислал, параллельно. Все потоки выполняются по-очереди. Версия, если что, у меня PRO.

@Dimionix, спасибо! Это подойдет, но только для PM, как написано в комментарии. Разве нельзя что-то подобное впихнуть так, чтобы прерывание работало и для ZP? Кейс, если кому-то он нужен, очень простой - при шаблоне, работающим, например, с длинными списками, в настройках которого можно задавать конкретное число обрабатываемых данных, пользователь может случайно запустить нежелательное (чрезмерно большое) кол-во. И ему придется ждать окончания выполнения шаблона, либо убивать ZP из процессов.

Update. Хотя увидел комментарий rostonix'а. Понял, что не будет реализовано :-)
 

gigavat

Super Moderator
Регистрация
17.11.2011
Сообщения
112
Благодарностей
88
Баллы
28
Как вы этим примером проверяете параллельность работы ?
 

Sample

Client
Регистрация
31.01.2016
Сообщения
25
Благодарностей
4
Баллы
3
Надеялся, что в лог информация будет сыпаться в разнобой. Сейчас же вижу, что пока конкретный поток не завершится, следующий ничего не сможет написать.
 

gigavat

Super Moderator
Регистрация
17.11.2011
Сообщения
112
Благодарностей
88
Баллы
28
Может быть вы тестируете в один поток ?
Вот видео работы вашего примера, видно что работают потоки параллельно http://screencast.com/t/JZ7PBnih
 
  • Спасибо
Реакции: Sample

gigavat

Super Moderator
Регистрация
17.11.2011
Сообщения
112
Благодарностей
88
Баллы
28
Вот вариант, как остановить работу C# кода в ZP.
Код:
if(((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted) break;
 
  • Спасибо
Реакции: Adigen, CSS и Sample

Sample

Client
Регистрация
31.01.2016
Сообщения
25
Благодарностей
4
Баллы
3
@gigavat, спасибо большое еще раз за ответы.
Попытался воспроизвести многопоток снова - отработало как надо. Поэтому делаю вывод: "то ли лыжи не едут, то ли я...." ©.
Если наткнусь опять - запишу видео. Потому что у меня было стойкое впечатление того, что запуская несколько потоков в C# боке, в каких-то случаях они выполнялись последовательно.
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)