У меня есть интерфейс, который читает/записывает объект в хранилище. В одном случае хранилище представляет собой базу данных с асинхронными методами. В другом случае это всего лишь куки.Когда используется Task.Run расточительный или бредовый?
Полагаю, что рекомендуется использовать async обратно по пути, заканчивающемуся при вызове асинхронного вызова, поэтому кажется, что интерфейс также является асинхронным. Но в случае с файлом cookie я просто устанавливаю пару полей и вставляю их в ответ, так что там еще нет асинхронных сообщений. Я могу обернуть этот бит в ожидании Task.Run(), чтобы соответствовать новому интерфейсу, но я не знаю, является ли это целесообразным или имеет какое-то негативное влияние на производительность.
Что делать?
public interface IProfileStore
{
async Task SetProfile(UserProfile profile);
}
public async Task SetProfile(UserProfile profile)
{
// Look mom, I'm needlessly async
await Task.Run(() =>
{
var cookie = new HttpCookie(AnonymousCookieName);
cookie["name"] = profile.FullName;
HttpContext.Current.Response.Cookies.Add(cookie);
});
}
Ну, каковы же шансы, что вы сможете заметить, что ваш код занимает нить TP за 30 наносекунд? Файлы cookie обычно работают с сетевыми соединениями, которые в * миллион раз больше латентности. –
@James Я не думаю, что вы можете использовать модификатор 'async' для интерфейса. –
Обратите внимание на статьи в [мой запрос async-wait] (http://curah.microsoft.com/45553/asyncawait-general). –