- Регистрация
- 31.01.2016
- Сообщения
- 25
- Благодарностей
- 4
- Баллы
- 3
Всем привет. Не могу все-таки понять как правильно работать с многопоточностью используя только блоки c#.
Если я все правильно понимаю, то, например, если у меня есть структура блоков действий (не только c#), то как только один из блоков заканчивает свое выполнение, поток может уступить процессорное время другому потоку.
Однако в случае работы с C# выходит так, что у меня есть куча логики в одном блоке, который не может прерываться и многопоточность не работает.
Проблема еще и в том, что я не могу даже остановить выполнение блока! Нажимая в ZennoPoster кнопку "Прервать", шаблон переходит в состояние "Закругляюсь", но доводит блок C# до конца.
В большей степени я обращал внимание именно на циклы.
Вот пример блока:
Я так понимаю, что добавление какого-нибудь SyncObject.ListSyncer тут роли не играет.
Если я добавлю в цикл Thread.Sleep(1000); и запускаю 10 потоков, то они действительно начинают идти в параллель. Получается, что цикл - это неделимая единица для многопоточности, при условии, что мы не заставляем поток уснуть насильно? Даже если я добавляю два одинаковых проекта в Zennoposter и запускаю их в разных потоках - все-равно они выполняются по очереди, если состоят только из цикла.
И еще - даже если мы указываем Sleep, проект все-равно не может остановиться!
Соответственно вопросы:
Спасибо! Искал-искал, но не нашел подобных вопросов. Если пропустил, то поделитесь ссылкой, пожалуйста.
Если я все правильно понимаю, то, например, если у меня есть структура блоков действий (не только 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;
Если я добавлю в цикл Thread.Sleep(1000); и запускаю 10 потоков, то они действительно начинают идти в параллель. Получается, что цикл - это неделимая единица для многопоточности, при условии, что мы не заставляем поток уснуть насильно? Даже если я добавляю два одинаковых проекта в Zennoposter и запускаю их в разных потоках - все-равно они выполняются по очереди, если состоят только из цикла.
И еще - даже если мы указываем Sleep, проект все-равно не может остановиться!
Соответственно вопросы:
- Можно ли как-то реализовать многопоточность не используя Sleep в циклах? Это похоже на вопрос конкретно по C#, но может быть есть какая-то специфика работы с ней в Zennoposter. Если нет...что ж, шлите меня в гугл.
- Как я могу прервать выполнение проекта в описанной выше ситуации?
- Если я получил значения списка через project.Lists["xxx"] и сохранил их в локальную переменную внутри блока C#, то смысла использовать SyncObject.ListSyncer нет? Его нужно использовать только когда внутри цикла идет непосредственно запись в список проекта (project.Lists["xxx"].Add(...))?
Спасибо! Искал-искал, но не нашел подобных вопросов. Если пропустил, то поделитесь ссылкой, пожалуйста.