ex Software Engineer at Reddit TS/React/GraphQL/Go
Task.Run(()=>outTextToConsole())
если нужно дождаться завершения таски то еще добавить await, получится await Task.Run
но это создание потока на цпу, все методы, которые имеют природу работать с диском, сетью и т.д. что может возвращать результат по прерыванию как правило уже возвращают результат типа Task и имеют суффикс Async
Даша Циклаури, наверное я сглупил и не написал, в общем есть функция которая сохраняет значение в excel, мне нужно вызвать ее асинхронно. Требуется дописывать или такой метод (примера "Привет мир !") будет работать ?
iXelper, если говорить грубо и в общем, то шаблон таков:
1) вызываем разные Tasks но без await, сохраняя в переменные, например
var t1 = Task.Run
var t2 = someTaskAsync
var t3 = Task.Run
...
2) и вызываем await уже только в том месте, когда нам нужно реально получить результат
например 50 строчек спустя
var res1 = await t1
в таком случае говорят, что функция t1 исполняется асинхронно вызывающему потоку, не блокируя его исполнение, блокировка происходит в момент вызова await до тех пор пока асинхронная функция не вернет результат
iXelper, в твоем случае 2 асинхронные операции:
1) расчеты которые могут вешать поток
2) запись в файл
вторую ты не можешь выполнить пока не выполнится первый, таким образом можно сделать что-то такое
async Task calcAndWriteToFile(string filename) {
var result = await Task.Run(()=>{
// calc data and return it
});
await SaveToExcelAsync(filename, result);
}
и уже в основном потоке вызвать await calcAndWriteToFile("somefile")
LiptonOlolo, ты пишешь что лучше, но не говоришь почему, можешь сослаться на статью или стэковерфлоу? и объяснить кейсы когда это полезно (например опции TaskCreationOptions)