Nikolay
public async Task<ServiceResult<List<User>>> GetAllUsersAsync()
{
try
{
var users = (await Db.QueryAsync<User>("select * from Users"))
.ToList();
if (users.Count == 0)
{
return ServiceResult<List<User>>("Users list is empty.");
}
return ServiceResult(users);
}
catch (Exception ex)
{
return ServiceResult<List<User>>("Unexcepted error.");
}
}
Romɑn
Romɑn
:D
Romɑn
Romɑn
Без ООП не пойдет
Nikolay
https://gist.github.com/Dolfik1/016e70960425114ec71516df74e2d80c
Nikolay
По идее можно как-то без try/with
Nikolay
Саму таску завернуть
Ayrat
let! users =
sqlQueryf<User> "select * from Users"
|> execute
|> Seq.toList
Ayrat
а как это вообще в async контексте работает?
Ayrat
выражение ж лист возвращает
Ayrat
а ты пытаешься через async.bind лист прибайндить
Ayrat
это точно компилируется?
Nikolay
Блин, тут косячно чутка
Nikolay
sqlQueryAsync вроде было
Nikolay
Аа, нет
Éminence grise
match users with
| [] -> err "Users list is empty"
| _ -> serviceResult users
Не надо считать
Ayrat
да один зер же ж
Nikolay
executeAsync
Nikolay
Ayrat
ну дальше тебе надо через async.map делать Seq.toList
Ayrat
чтобы получить Async<List<User» который уже можно байндить через let!
Nikolay
Ayrat
таска не композируется через пайплайн оператор с Seq.toList
Nikolay
А, я понял про что ты)
Ayrat
и ещё у меня претензия что слишком императивнненько.
Есть же готовая монадка AsyncResult
Ayrat
от Сайма по-моему даже
Nikolay
Не, там у меня своя головная боль
Nikolay
https://gist.github.com/Dolfik1/016e70960425114ec71516df74e2d80c
Nikolay
Поправил
Nikolay
Так должно быть ок
Nikolay
Хотя хз
Ayrat
вообще ужасно
Ayrat
ты делаешь синхронную работу в асинхронном контексте
Ayrat
минус тред
Ayrat
привет thread starvation
Nikolay
Блин, я хз как тогда)
Ayrat
асинки ж на тредпуле выполняются, ты камуфлируешь синхронную работу за асинхронную, а она ей не является
Ayrat
(можно просто убрать async, или сделать асинхронный вызов, executeAsync я хз)
Ayrat
Async можно создать ручками через континуейшны
Nikolay
Ayrat
или через BeginSomething EndSomething методы
Ayrat
Nikolay
А таска уже может вызываться асинхронно
Ayrat
Так. давай кой чо проясним
Nikolay
let usersTask = getAllUsersAsync()
...
let! users = usersTask
Ayrat
между Асинкам и Тасками не так много разницы. Они выполняются на тредпуле.
Если ты в эти обёртки пихаешь синхронную, долгую работу, то они рано или поздно выжрут все треды из тред пула
Ayrat
для этого при создании таски есть возможность указать что она LongRunning
Vasily
То ли дело гопак
Ayrat
тогда шедулер создат отдельный тред (минус метр оперативы) в ОС для твоей таски и заблочит её радостно
Ayrat
тредпул останется в покое
Ayrat
при создании асинка я не знаю способов указать что её надо НЕ на тредпуле создавать, поэтому ты себе в ногу стреляешь из базуки
Ayrat
магии не происходит
Nikolay
Nikolay
Недавно писал же filters list
Vasily
Хня написана
Vasily
Надо ContinueWith
Vasily
Тогда уж
Vasily
И тогда не нужен try
Nikolay
🤔
Nikolay
Запутали
Vasily
У тебя уже есть так
Vasily
Таск
Vasily
Прицепи к нему ещё один
Nikolay
Ладно, я ещё позже подумаю
Vasily
Ну просто таск внутри таска это такое
Vasily
Проще цепочку протащить
Ayrat
Vladislav
у меня глупый вопрос есть
Nikolay
Vladislav
inline в F# нужен только когда надо srtp и более умные констрейнты на дженерики?
Romɑn
Nikolay
Где ошибка User list is empty?
Nikolay
Nikolay
Тебе тут не место
Nikolay
:D