Сообщение Re: Task Parallel Library от 30.01.2017 14:14
Изменено 30.01.2017 14:19 Sinix
Re: Task Parallel Library
Здравствуйте, Somescout, Вы писали:
S>Перефразирую в виде задачи — есть большое количество элементов, над которыми надо выполнить параллельную работу, но если просто запустить её сразу для всех — кончается память. Хотелось бы скормить все элементы и просто дождаться завершения. В идеале с возможностью добавления новых элементов в очередь с ожиданием.
Для раскидывания наргузки по нескольким ядрам проще всего использовать Parallel.ForEach. Если хочется то же самое на тасках — свой шедулер. Как пример.
S>PS. Можно ли жёстко прервать задачу? (т.е. не через Cancellation token)
Формально — можно, в CancellationToken есть метод Register(), который позволяет получить уведомление о прерывании операции, дальше прерываем, как удобно.
На практике бесполезно, т.к. в принципе оно ничем не отличается от расстрела произвольной области памяти — продолжать выполнение после прерывания потока в произвольной точке бессмысленно.
S>Перефразирую в виде задачи — есть большое количество элементов, над которыми надо выполнить параллельную работу, но если просто запустить её сразу для всех — кончается память. Хотелось бы скормить все элементы и просто дождаться завершения. В идеале с возможностью добавления новых элементов в очередь с ожиданием.
Для раскидывания наргузки по нескольким ядрам проще всего использовать Parallel.ForEach. Если хочется то же самое на тасках — свой шедулер. Как пример.
S>PS. Можно ли жёстко прервать задачу? (т.е. не через Cancellation token)
Формально — можно, в CancellationToken есть метод Register(), который позволяет получить уведомление о прерывании операции, дальше прерываем, как удобно.
На практике бесполезно, т.к. в принципе оно ничем не отличается от расстрела произвольной области памяти — продолжать выполнение после прерывания потока в произвольной точке бессмысленно.
Re: Task Parallel Library
Здравствуйте, Somescout, Вы писали:
S>Перефразирую в виде задачи — есть большое количество элементов, над которыми надо выполнить параллельную работу, но если просто запустить её сразу для всех — кончается память. Хотелось бы скормить все элементы и просто дождаться завершения. В идеале с возможностью добавления новых элементов в очередь с ожиданием.
Для раскидывания наргузки по нескольким ядрам проще всего использовать Parallel.ForEach. Если хочется то же самое на тасках — свой шедулер. Как пример.
S>PS. Можно ли жёстко прервать задачу? (т.е. не через Cancellation token)
Формально — можно, в CancellationToken есть метод Register(), который позволяет получить уведомление о прерывании операции, дальше прерываем, как удобно.
На практике бесполезно, т.к. в принципе оно ничем не отличается от расстрела произвольной области памяти — продолжать выполнение после прерывания потока в произвольной точке бессмысленно.
UPD, к ответу ув. Sharov:
и вот это тогда: http://stackoverflow.com/a/11100423
S>Перефразирую в виде задачи — есть большое количество элементов, над которыми надо выполнить параллельную работу, но если просто запустить её сразу для всех — кончается память. Хотелось бы скормить все элементы и просто дождаться завершения. В идеале с возможностью добавления новых элементов в очередь с ожиданием.
Для раскидывания наргузки по нескольким ядрам проще всего использовать Parallel.ForEach. Если хочется то же самое на тасках — свой шедулер. Как пример.
S>PS. Можно ли жёстко прервать задачу? (т.е. не через Cancellation token)
Формально — можно, в CancellationToken есть метод Register(), который позволяет получить уведомление о прерывании операции, дальше прерываем, как удобно.
На практике бесполезно, т.к. в принципе оно ничем не отличается от расстрела произвольной области памяти — продолжать выполнение после прерывания потока в произвольной точке бессмысленно.
UPD, к ответу ув. Sharov:
и вот это тогда: http://stackoverflow.com/a/11100423