
Friedrich
06.06.2017
11:58:15

Pawel
06.06.2017
12:00:49

Roman
06.06.2017
12:01:03
есть ли типы, которые моно использовать только внутри бидонов?
*билдера?

Google

Friedrich
06.06.2017
12:01:39

Pawel
06.06.2017
12:02:12

Roman
06.06.2017
12:02:19
типа
graph {
let a = myTypeConstructFunction()
let b = another ()
return a+b}

Friedrich
06.06.2017
12:03:18
я имел в виду как это на F# выглядит
Не, я на C# так фигачу. На F# обычно (пока что) хватает выпендрежа на инлайнах.
А вот можно ли на F# составить такие конструкции — это вопрос, на самом деле. Зависимость между генерик-аргументами же не получалось построить?

Pawel
06.06.2017
12:07:13

Friedrich
06.06.2017
12:07:42
Хмм, интересно!

Pawel
06.06.2017
12:08:41
было бы интересно, если бы получилось) а так - пшик, не более. трихомонада не выросла одним словом)

Aleksander
06.06.2017
12:24:32
а получалось ли у кого-нибудь подружить свои кастомные computation expressions с async?

Vasily
06.06.2017
12:25:26
А в чем там может быть проблема?

Roman
06.06.2017
12:25:58
Там же вроде внутри реализации bind вызываешь Async.Нужная ф-ция и все ок

Vasily
06.06.2017
12:26:57
let r2=async{
return req{
header "Authorization" "Basic"
header "MyHeader" "MyValue"
}
}

Google

Aleksander
06.06.2017
12:27:26
сейчас

Roman
06.06.2017
12:27:32
https://github.com/haf/expecto/blob/master/Expecto/Expecto.fs#L1389

Aleksander
06.06.2017
12:28:24
была мысль попробовать что-то вроде этого - https://stackoverflow.com/a/4306711
но т.к. сейчас почти все асинхронное, то надо еще и асинк как-то туда прикручивать

Vasily
06.06.2017
12:32:25
Ну введи кастомную операцию Async
По ссылке интересная концепция репозитория
В теории, можно сделать ее интереснее\

Aleksander
06.06.2017
12:46:06
ну у меня была мысль все сайд эффекты обернуть в IEnvironment :)

Pawel
06.06.2017
12:46:21

Aleksander
06.06.2017
12:50:30
ну веб-клиентовский DownloadDataAsync вообще не про новый async
а в целом - конечно, думать надо)

Vasily
06.06.2017
12:52:09
Ну всегда можно HttpClient.SendRequest завернуть в async внутри своего кода
Нафиг тащить c# имплементацию, неясно

Pawel
06.06.2017
13:04:44
"Нафиг тащить c# имплементацию, неясно" - например чтобы иметь возможность нормально отменить асинхронное вычисление, А не ждать комплита какого нибудь часового лонгпола.

Friedrich
06.06.2017
13:06:10

Pawel
06.06.2017
13:06:21
вообще я не знаю ни одного программиста (включая себя) который бы умел правильно раставлять асинки и авэйты.

Vasily
06.06.2017
13:06:53

Google

Roman
06.06.2017
13:18:55

Pawel
06.06.2017
13:19:00
С общим посылом я согласен, но в чём конкретная проблема WebClient.DownloadAsync?
в await шедулер может распаралелить вычисления. Это очень тяжко дебажить и иногда приводит к совсем уж фантастическим гонкам данных - в агентах,например. Я как то раз долго не мог въехать какого хрена у меня агент одновременно пишет в базу. Очень трудно просчитать все ветвления control flow при одновременности, а любой async увеличивает их количество эксполненциально. Но конечно для хелуворда пофиг)

Roman
06.06.2017
13:20:13
а никто не знает, почему FAKE в ionide не встроили в стандартный таскраннер для VSCode? как напримерс gulp сделали

Pawel
06.06.2017
13:25:12

Roman
06.06.2017
13:25:34

Pawel
06.06.2017
13:27:10
говнокод не говнокод, но Sleep ты хрен-с-два отменишь в safe коде

Friedrich
06.06.2017
13:27:53
Как и любое вычисление, в которое не проброшен CancellationToken.

Roman
06.06.2017
13:27:58
ты и в Task его не отменишь. Не пользуйся Thread.Sleep для того чтоб что-то ждать. Пользуйся Task.Delay

Pawel
06.06.2017
13:34:03
так речь шла про то, почему не надо заворачивать HttpClient.SendRequest в async. Потому что он ни чем не оличается от Sleep
кстати не вижу чем CancellationToken принципиально оличается от атомного флага кроме того, что флаг значительно проще и удобнее

Friedrich
06.06.2017
13:41:15
Я, кстати, всегда дико печалюсь, что нету асинхронного File.Exists :(

Pawel
06.06.2017
13:42:00
у тебя наверное совсем старый механический винт)

Friedrich
06.06.2017
13:43:14
У меня есть специальный ноутбук для выездов на исследования, в нём и правда всё железо смертельно бюджетное. Чтоб не жалко было потерять, если что.
И на нём серьёзно заметны тормоза при File.Exists :)

Pawel
06.06.2017
13:45:21
ну а как ты себе представляешь одновременность позиционирования головки мех. винчестера?)

Nikolay
06.06.2017
13:48:07

Pawel
06.06.2017
13:49:10
если просто не хочется тормозить гуй пока он файл мучительно ищет, заверни в async да и вася

Google

Nikolay
06.06.2017
13:50:05

Friedrich
06.06.2017
13:50:20
На каком-нибудь хайлоадном сервере это бы могло запросто создавать больше проблем, чем решать. Но в гуйне на дохлом ноутбуке — безусловное добро.

Nikolay
06.06.2017
13:51:18
Параллельный File.Exists?

Friedrich
06.06.2017
13:51:47

Nikolay
06.06.2017
13:52:40
Ну ни параллельный, ни асинхронный не будут блокировать гуй же?

Friedrich
06.06.2017
13:52:48
Да.
Но асинхронного не существует, а параллельный мы можем сами сделать из любого кода :)

Nikolay
06.06.2017
13:54:11
Task.Run(() => files.Any(f => File.Exists(f)))
Чем не асинхронный? :)

Friedrich
06.06.2017
13:54:33
Я чёт в твоей терминологии запутался. Мне казалось, что это "параллельный".
Ну, в том смысле, что он на всё время выполнения блокирует параллельный тред.
А асинхронный бы не блокировал.

Nikolay
06.06.2017
13:55:41
Параллельный - это когда в нескольких потоках выполняется решение задачи
Асинхронный - это когда в одном потоке выполняется задача
Оба неблокирующие получаются, т.к. работают в отличном от UI потоке*

Friedrich
06.06.2017
13:56:05
Короче, у меня там один файл. Его нельзя проверять на существование "параллельно" в твоей терминологии :)

Roman
06.06.2017
13:59:26

Nikolay
06.06.2017
13:59:30
var files = new string[]
{
"a.txt",
"b.txt",
"c.txt"
};
var a = Task.Run(() => files.Any(f => File.Exists(f))); // асинхронно
var p = files.AsParallel().Any(f => File.Exists(f)); // параллельно
Вот что я имел ввиду)

Friedrich
06.06.2017
13:59:58

Vasily
06.06.2017
14:00:02
Первая функция неверна

Google

Nikolay
06.06.2017
14:00:07
Оу, забыл в таск обернуть

Friedrich
06.06.2017
14:00:23

Nikolay
06.06.2017
14:00:37
Вот так лучше

Roman
06.06.2017
14:00:48
нее

Vlad
06.06.2017
14:01:06

Roman
06.06.2017
14:01:09
var a = Task.Run(() => files.Any(f => File.Exists(f))).ContinueWith(...);

Nikolay
06.06.2017
14:01:45

Roman
06.06.2017
14:01:47
то что внутри континуейшена будет выполнено асинхронно

Vlad
06.06.2017
14:02:00
Но это не асинхронность

Nikolay
06.06.2017
14:02:35
:(

Roman
06.06.2017
14:02:49
File.Exists будет работать паралелльно а континуейшн асинхронно

Vasily
06.06.2017
14:02:53
Вы уж с терминами определитесь

Vlad
06.06.2017
14:03:18
При асинхронности твой поток бы ушел в пул, а не висел в ожидании

Vasily
06.06.2017
14:03:25
Внутри ContinueWith все равно есть поток, который ожидает выполнения задачи

Friedrich
06.06.2017
14:03:30

Vasily
06.06.2017
14:03:52
Или я совсем не понимаю, как оно работает

Roman
06.06.2017
14:03:55

Nikolay
06.06.2017
14:04:03

Vasily
06.06.2017
14:04:04
Иначе это начинает выглядеть как магия

Friedrich
06.06.2017
14:04:26
Внутри ContinueWith — обязательно