Pull to refresh
56
0

Пользователь

Send message
Не могу знать специфики ваших проектов, но вот даже в простом текстовом редакторчике нашлось несколько мест, где оказался уместным With.
Пропустил вопрос.

Ваши претензии насчёт «читаемости» кода лучше адресовать к архитекторам C#, которые ввели именно такую реализацию async...await с немалым количеством подводных камней.

Что касается написанного именно мной кода, то он весьма тривиален — это всего лишь цепочные вариации метода ForEach очень схожие с одноименным методом у класса List. То есть запросто без всяких дополнительных расширений сейчас можно писать такой код
new List<ADocument>() {...}
    .ForEach(async d => await d.DoSomething());

Насколько понимаю, вы хотите сказать, что интуитивное добавление async...await ломает его читабельность?

Да, я ошибся с тем, что он должен выполняться параллельно, но при искуственном добавлении задержки в метод Load ничего в моей программе не сломалось и не заблокировалось, просто текст из файла загрузился чуть позже, из чего делаю вывод, что интуиция меня не подвела и работает код, по крайней мере, асинхронно, как и хотелось.
я слишком стар для...
Будьте молоды душой! :)
Если у вас WaitAll — кастомное расширение, то лучше дать ему название AwaitAll, ибо оригинальный WaitAll — это синхронный вызов
public static void WaitAll(
	params Task[] tasks
)
В конкретном случае главной вью-модели вообще не важен результат загрузки. Но, например, важен результат закрытия: в самом конеце файла, 81 строка, метод Close.

Благодарю за бенчмарки. Примерно таких результатов я и ожидал — всё в допустимых пределах, различия нет даже в десять раз. Одна и пять миллионных секунды — в подавляющем большинстве практических случаев неразличимы.

По fallbackValue, методу нужен булевый признак и он работает с value types, которые оператор 'as' не поддерживает.

Потому что нет лишних ресурсов.

Много же нужно ресурсов, чтобы вместо выражения
object.Equals(...) подставить
EqualityComparer<T>.Default.Equals(...)

«Интересные вещи» — совсем не то же самое, что «обобщение».

Рассматриваемые интересные вещи уже довольно-таки обобщены на широкий круг сценариев.
Метод — тоже набор инструкций. А aggressive inlined метод — набор инструкций, который делает вид, что он метод.
Если нужно, то что-то может быть и заблокировано на время.
Когда вы впервые видите какой-то метод, то зачастую не знаете деталей его имплементации — это нормально, вы просто смотрите код или читаете описание в документации.

public static IList<T> ForEach<T, TR>(
	this IList<T> collection,
	Func<T, TR> action)
{
	foreach (var item in collection)
		action(item);
	return collection;
}


После этого многие вопросы пропадают, и вас уже не смущает этот же вызов в другом месте программы.
Ну так не читайте и не понимайте, никто здесь вас не принуждает чего-то делать. )

Просто ваша призыв выглядит сейчас так: «Не учите интегралы, они трудные, с ними легко ошибиться, и они, наверняка, не пригодятся вам в жизни. Пользуйтесь школьной математикой, она простая, понятная, хорошо применима на практике, и многие ей хорошо владеют».
Не блокировать UI, а работать асинхронно.

Вся логика работы с файлом (или группой фалов) инкапсулирована внутри самого документа.

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

1. Подготовили докуметы к работе
2. Асинхронно вызвали параллельную загрузку данных в каждый

Всё. Документы уже готовы к работе и сами разберутся, что делать при возникновении ошибок.
Думаю, что развитие программирования идёт эволюционным путём. Как существуют различные царства живых существ, так и различные подходы к программированию.

Каждый подход имеет свои преимущества и недостатки, которые делают его более оптимальным или неоптимальным для тех либо иных задач. Равно как в определённых условиях одни виды жизни более успешны, чем другие, а в других условиях — наоборот.

Многообразие — важный механизм эволиции. )
Работает по аналогии с вызовом обычных методов
GetPerson()?.MethodA().MethodB();
По сути, инициализационный блок — это explicit aggressive inlined метод.
Вам они, может, и не нужны, но плодами применения интегралов в инженерных расчётах вы пользуетесь в обыденной жизни регулярно.
Не знаю, что вы подразумеваете под «добейся».

Конечно, я обычный человек, который может ошибаться, но над архитектурой редактора размышлял очень много времени. Это не единственный возможный вариант, но он мне очень даже нравится.
Для этого Save и асинхронный, если возникнет необходимость в такой загрузке, то Save будет внутри себя ожидать её завершения.

Information

Rating
Does not participate
Registered
Activity