интерфейс четко указывает, что это задача, и здесь мне нужно, чтобы получить а не значение.
Когда интерфейс объявляет метод, который возвращает Task или Задача <T> имя метода должно - по соглашению - также заканчиваться «Async»: https://msdn.microsoft.com/en-us/library/hh191443
Такой метод, как ожидается, будет реализован как метод асинхронной, который возвращает объект типа T, если возвращаемый тип объявлен как Task <T> или вообще ничего, если возвращаемый тип просто Задача:
public interface IService
{
Task<double> GetDataAsync(int id);
}
public class Service : IService
{
public async Task<double> GetDataAsync(int id)
{
await Task.Delay(1000);
return 1.0;
}
}
Вы бы ждать су ч метод:
public class Consumer
{
public async void Doit()
{
IService service = new Service();
double d = await service.GetDataAsync(1);
}
}
Теперь метод фактически является реализован ли как метод асинхронной является деталью реализации в конкретной реализации интерфейса, но это действительно не имеет значения, насколько потребитель интерфейса что вы все еще можете ожидать метода, который возвращает задачу или задачу (при условии, что метод вызывающего абонента, по-видимому, помечен ключевым словом async).
Вы бы, например, быть в состоянии ждать следующую реализации без асинхронной методы точно так же:
public class Service : IService
{
public Task<double> GetDataAsync(int id)
{
return Task.FromResult(1.0);
}
}
Так методов, которые имеют тип возврата задачи или задачи <T> предназначены для асинхронный и ожидаемый.
Вы могли еще хранить экземпляр фактического типа возвращаемого значения метода в переменной «как обычно», хотя:
public void Doit()
{
IService service = new Service();
Task<double> task = service.GetDataAsync(1);
}
Это, однако, просто вызвать асинхронно, не дожидаясь его возвращаемого значения, что делает его довольно бесполезно даже назвать метод в первую очередь. При вызове асинхронного метода аранжировки и условного соглашения, который возвращает задачу <double>, вы заинтересованы в получении двойного значения обратно asynchronously. Вы действительно не заботитесь о самом объекте Task, если понимаете, что я имею в виду.
это потому, что Task возврат двойной. GetData получит данные в фоновом режиме и вернется к основному потоку в качестве dobule –
Sasha
Подробнее о 'await' ключевое слово – Backs
Может быть, я должен изменить способ, которым я его называю? Задача t = Задача. Run (() => _svc.GetData (id)); ? –