Волокна в C#:быстрее ли они итераторов, и использовали ли их люди?

StackOverflow https://stackoverflow.com/questions/1881473

  •  18-09-2019
  •  | 
  •  

Вопрос

Итак, я болтал с коллегой о волокна и появился эта статья 2003 года который описывает реализацию сопрограмм на C# с использованием Fiber API.

Реализация Yield в этой статье речь шла о .NET 1.1, поэтому она предшествует yield return синтаксис, появившийся в .NET 2.0.

На первый взгляд определенно кажется, что реализация здесь потенциально быстрее и может довольно хорошо масштабироваться на несколько процессоров.

Кто-нибудь использовал его?

Это было полезно?

Решение

Я не использовал его, но у меня есть интерес к этой теме.Вот одна хорошая реализация сопрограмм на C# с циклическим планировщиком: http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=71235c5a-3753-4bab-bdb0-334ab439afaf

Кстати, цитирую Википедия, «волокна описывают по существу ту же концепцию, что и сопрограммы».Насколько я знаю, самое близкое к сопрограмме (или волокну) в C# — это итераторы.На самом деле они очень близки к сопрограммам. Липперт опубликовал несколько замечаний об итераторах.Будем надеяться, что ни один из них не представляет серьезной проблемы для нужных вам целей.

Другие советы

Я использовал «сопрограммы», основанные на доходности, и должен сказать, что они — заноза в заднице.Проблема, конечно, в том, что везде, где вы хотите их использовать, вы вынуждены использовать синтаксис доходности.Более того, если вы не объединяете доходность (родительский доход дочернего элемента), вы можете вкладывать свои сопрограммы только на один уровень глубины.Это полностью уничтожает одно из ключевых преимуществ сопрограмм (полное сохранение/восстановление стека).

Я реализовал систему сопрограмм на основе волокон на C#, и она работала чудесно, пока я не столкнулся с исключением.К сожалению, среда выполнения .Net хранит множество внутренних исключений в потоках ОС, а это означает, что эмуляция нескольких потоков с использованием волокон ОС (и p/invoke) просто не будет работать, если у вас никогда, никогда не возникнет исключение.

Сопрограммы с первого взгляда привлекают мое внимание..несколько дней назад я искал решение рабочего процесса для параллельных вызовов метода AsyncWCF, и то, что я нашел, было действительно захватывающим:

http://csharperimage.jeremylikness.com/2010/03/sequential-asynchronous-workflows-in.html

в этой статье показано очень хорошее использование сопрограмм для создания рабочих процессов и управления ими в приложении Silverlight, которое использует WCF с использованием шаблона Async.

Я не знаю его скорости по сравнению с итераторами, но для меня это как расширенная форма подпрограмм, которая может быть очень полезна в критически важных задачах, где обычная подпрограмма не может позволить себе роскошь выполнять задачу параллельно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top