
Vlad
06.06.2017
14:05:02

Vasily
06.06.2017
14:05:07
Другой вопрос, что у нас не блокируется текущий поток исполнения, и это и называется асинхронностью

Friedrich
06.06.2017
14:05:24
Почему?
Потому что вот этот код будет *ждать* завершения параллельной обработки. Гуй-тред повиснет
Представь, что там сто тысяч файлов в списке.

Google

Vasily
06.06.2017
14:06:03
Если сто тыщ файлов, то нужен правильный енумератор

Friedrich
06.06.2017
14:06:04
Тред-пул будет параллельно сто тыщ запросов на диск отправлять и ждать, а гуй будет висеть.

Nikolay
06.06.2017
14:06:16

Friedrich
06.06.2017
14:06:31

Vasily
06.06.2017
14:07:02
Ну AsParallel же настроить можно

Friedrich
06.06.2017
14:07:08
В общем, в моей терминологии "асинхронное" — это которое не вешает вызвавший поток.

Vasily
06.06.2017
14:07:12
Скока одновременно, все дела

Friedrich
06.06.2017
14:07:37

Vasily
06.06.2017
14:07:39
Просто я не понимаю утверждения про то, что нет потока ожидающего

Friedrich
06.06.2017
14:08:13
Потока может не быть в самом простом кейсе при использовании TaskCompletionSource.
Например, Task.Delay не обязан порождать никаких потоков вообще.

Vlad
06.06.2017
14:08:42

Google

Vlad
06.06.2017
14:10:03
То, что оно гуй тред не вешает не делает операцию асинхронной

Roman
06.06.2017
14:11:44
А что тогда?
Можно задать опцию чтобы континуейшн выполнялся на том же самом потоке, по умолчанию из тред пула будет взят новый поток. Но взят он будет только когда предыдущая таска завершилась
вообще Task это обертка для асинхронной операции

Vlad
06.06.2017
14:13:35
Ну не совсем

Roman
06.06.2017
14:13:59
только в отличие от F# async она горячая

Vlad
06.06.2017
14:14:36
Task.Run() это тупой запуск кода на потоке из тред пула

Roman
06.06.2017
14:14:36
Task.Run это частный случай
TaskCompletionSource хороший пример

Vlad
06.06.2017
14:16:10
Просто сам Task это более абстрактная вещь, чем Thread. И для асинхронности в том числе
Там раньше же были через события и IAsyncResult паттерны

Roman
06.06.2017
14:17:13
Async patternа

Vlad
06.06.2017
14:18:11
Просто я к тому, что асинхронность это не про Task, а про другое.

Vasily
06.06.2017
14:18:39
Ну если под асинхронностью понимать механизм колбэков, то да, другое

Roman
06.06.2017
14:19:02
https://msdn.microsoft.com/en-us/library/jj152938(v=vs.110).aspx
Так Task это и есть имплементация кэлбэков но с человеческим лицом

Vasily
06.06.2017
14:20:41
Интересно, какие там внутри примитивы синхронизации

Roman
06.06.2017
14:21:04
К сожалению их используют в основном для Task.Run и Task.Fatory.StartNew

Roman
06.06.2017
14:21:51

Google

Friedrich
06.06.2017
14:21:54

Vlad
06.06.2017
14:22:47
Просто с определениями проблемы возникают от того, что через таск можно все что угодно запустить

Friedrich
06.06.2017
14:22:54
Например, в стандартной пинговалке или отправлялке емейлов (которая уже deprecated) довольно хитрый код на TaskCompletionSource.
В пинговалке так они там балуются и ансейфом, и GC.KeepAlive и вообще чёрт знает чем.

Roman
06.06.2017
14:23:58
TaskCompletionSource вообще классная вещь.
С ним такие вещи мутить можно
в Асинке фшарпном кстати тоже такое есть
Async.FromContinuations

Igor
06.06.2017
14:34:51

Roman
06.06.2017
14:35:28

Friedrich
06.06.2017
14:36:10

Roman
06.06.2017
14:36:13
var tcs = new TaskCompletionSource();

Igor
06.06.2017
14:36:15
Ну TaskCompletionSource для это и дан, что нельзя
var task = new Task<string>();
task.CompleteSuccess(“hello world”);
task.CompleteFailed(new Exception());

Roman
06.06.2017
14:36:21
tsc.Task

Friedrich
06.06.2017
14:36:35
Ну, конкретно так нельзя, но по смыслу на TCS то же самое.

Igor
06.06.2017
14:36:45
Я и говорю, сущности плодят, когда в др языках это один класс

Roman
06.06.2017
14:37:52

Friedrich
06.06.2017
14:38:16

Igor
06.06.2017
14:38:41
Толстоватый наброс

Friedrich
06.06.2017
14:38:58
Ну, промисы в жс ты видал, например?

Google

Friedrich
06.06.2017
14:39:15
Хоть "старые", на deferred, хоть новые. Там намного больше сущностей.

Roman
06.06.2017
14:40:16
А жаве таску можно вот так вот закомплитить?

Friedrich
06.06.2017
14:40:46

Roman
06.06.2017
14:41:12

Friedrich
06.06.2017
14:41:30
Отличие от нашего варианта минорное, на мой взгляд.

Roman
06.06.2017
14:41:36
то есть еще и интерфейсы прибабахали
мне вариант с TCS больше нравится

Friedrich
06.06.2017
14:43:36
А в жаве любят интерфейсы, это норм
У них просто так заведено, а у нас эдак.

Igor
06.06.2017
14:46:29

Nikolay
06.06.2017
15:22:19
Как думаете, что лучше, Exception или Result?

Vasily
06.06.2017
15:23:03
Result

Nikolay
06.06.2017
15:23:23
Result вроде как обязывает делать обработку ошибок, но код получается громоздковатым

Vasily
06.06.2017
15:23:48
Ну он скорее подталкивает более полно описывать предметную область

Nikolay
06.06.2017
15:24:15
И цепочку выражений сделать не получится
Или получится?

Friedrich
06.06.2017
15:24:26
И даже не совсем так.

Vasily
06.06.2017
15:24:41
Короче
Есть статья на тему

Google

Friedrich
06.06.2017
15:24:52
Мне кажется, что использование или неиспользование непроверяемых исключений зависит от твоей стратегии.

Vasily
06.06.2017
15:25:04
http://fsharpforfunandprofit.com/rop/

Friedrich
06.06.2017
15:25:21
Если ты решил, что какие-то ошибки (ну, скажем, в конфигурации проекта) являются фатальными и надо падать — то ты в том модуле забиваешь на Result и плюёшься исключениями.
Но если у тебя ошибки — часть доменной логики, то тогда только Result.

Vasily
06.06.2017
15:26:25
В целом, всегда может прилететь НЁХ и все сломать
Но ее лучше ловить централизованно, по идее
Просто при использовании исключений часто есть соблазн использовать их как часть control flow
А потом и не как часть :)

Roman
06.06.2017
15:50:26

Evgeniy
06.06.2017
16:05:33
Result -- это не очень хорошо.
Лучше специализированные DU для ошибок, которые будут описываться в рамках доменной логики.
@Dolfik https://eiriktsarpalis.wordpress.com/2017/02/19/youre-better-off-using-exceptions/

Vasily
06.06.2017
16:09:26
А кто мне за fable может рассказать?

Igor
06.06.2017
16:10:50
А что тебе рассказать?
Они интегрировались в dotnet и теперь проект создается в 2 команды http://fable.io/blog/Paket-integration.html
Ждем релиза 1.0

Vasily
06.06.2017
16:11:35
Под обычным дотнетом они живут, кстати, или только под корой?

Friedrich
06.06.2017
16:12:56

Igor
06.06.2017
16:13:44

Pawel
06.06.2017
16:21:41
@Dolfik https://eiriktsarpalis.wordpress.com/2017/02/19/youre-better-off-using-exceptions/
Ну вот это точно содомия :
type MoneyWithdrawalResult =
| Success of amount:decimal
| InsufficientFunds of balance:decimal
| CardExpired of DateTime
| UndisclosedFailure
правильно -
type Error =
| InsufficientFunds of decimal
| CardExpired of DateTime
| UndisclosedFailure
type MoneyWithdrawalResult =
| Ok of decimal
| Err of Error
ибо хоть 2) - унификация а 1) неподдерживаемый велосипед