2015-01-21 2 views
-2

Я читал много о Задаче в последнее время, и я должен сказать, что я думал, что понял, но как только вы читаете блоги Стивена Клири и Джона Скита, я начал понимать, что там это больше, чем кто-либо думает.Интерфейс - это задача, но у меня нет никакого асинхронного кода

Итак, я реализую интерфейс, основанный на TASK (это не мой интерфейс, его часть AspNet.Identity IUserPasswordStore). Правильно ли это это реализовать?

public Task<bool> HasPasswordAsync(ApplicationUser user) 
{ 
    return Task.Factory.StartNew(() => true); 
} 

Это своего рода тривиальный вопрос, но вы никогда не знаете, что они могли бы быть «ах, но вы знаете, что это будет делать»

Остальная часть кода все выращены из асинхронной кода так kinda просто пишет свое «я», что-то вроде, мне нужно преобразовать начальный/конечный шаблон в TAP.

+0

Пожалуйста, прочтите интерфейсную часть, я буду редактировать и добавлять Thats его не мой интерфейс. –

ответ

0

Вы не читали достаточно хорошо :)

В любом случае, когда вы просто хотите, чтобы обернуть результат в готовой задаче, нет никакой необходимости раскручивать новую Threadpool работу. Просто используйте

Task.FromResult(false) 

В этом случае, это хорошо, чтобы выставить Task в интерфейсе. Однако, если вы просто использовали Task.Run или аналогичный, не делайте этого. Это именно то, что вы найдете в блоге Стивена как «плохие идеи». Если ваш интерфейс кажется достаточно широким для размещения вещей, которые по своей сути являются асинхронными и в то же время по своей сути синхронными, вам, вероятно, придется сузить свои интерфейсы.

+0

спасибо, я должен был действительно выглядеть немного сложнее :) –

0

Я реализую интерфейс, основанный на TASK. Является ли это правильным способом реализации этого?

Вообще говоря, нет. You shouldn't expose async wrappers over sync methods.

Почему вы не должны этого делать? потому что это может смутить конечного пользователя, который считает, что ваш метод является чисто асинхронным IO привязанным операцией (поскольку это то, что большая часть BCL предоставляет для нас), но будет удивлен, увидев, что это на самом деле нет.

Именно поэтому рекомендуемый подход заключается в том, чтобы использовать , чтобы пользователь явно вызывал синхронную версию в новом потоке.

Вместо этого:

public bool HasPassword(ApplicationUser user) 
{ 
    return true; 
} 

И пусть его делегат его:

var hasPassword = Task.Run(() => HasPassword(user)); 
Смежные вопросы