У меня есть два проекта в моем решении: проект WPF и библиотека классов.
В моей библиотеке классов:
У меня есть Список Символов:
class Symbol
{
Identifier Identifier {get;set;}
List<Quote> HistoricalQuotes {get;set;}
List<Financial> HistoricalFinancials {get;set;}
}
Для каждого символа я запрашиваю финансовую услугу для получения исторических финансовых данных для каждого из моих символов, используя веб-запрос. (WebClient.DownloadStringTaskAsync(URI);)
Итак, вот мой метод, который делает это:
public async Task<IEnumerable<Symbol>> GetSymbolsAsync()
{
var historicalFinancialTask = new List<Task<HistoricalFinancialResult>>();
foreach (var symbol in await _listSymbols)
{
historicalFinancialTask.Add(GetFinancialsQueryAsync(symbol));
}
while (historicalFinancialTask.Count > 0)
{
var historicalFinancial = await Task.WhenAny(historicalFinancialTask);
historicalFinancialTask.Remove(historicalFinancial);
// the line below doesn't compile, which is understandable because method return type is a Task of something
yield return new Symbol(historicalFinancial.Result.Symbol.Identifier, historicalFinancial.Result.Symbol.HistoricalQuotes, historicalFinancial.Result.Data);
}
}
private async Task<HistoricalFinancialResult> GetFinancialsQueryAsync(Symbol symbol)
{
var result = new HistoricalFinancialResult();
result.Symbol = symbol;
result.Data = await _financialsQuery.GetFinancialsQuery(symbol.Identifier); // contains some logic like parsing and use WebClient to query asynchronously
return result;
}
private class HistoricalFinancialResult
{
public Symbol Symbol { get; set; }
public IEnumerable<Financial> Data { get; set; }
// equality members
}
Как вы можете видеть, я хочу, чтобы каждый раз, когда я загружаю финансовые исторические данные на символ, чтобы получить результат, а не ждать, пока все мои вызовы будут завершены.
И в моем WPF, вот что я хотел бы сделать:
foreach(var symbol in await _service.GetSymbolsAsync())
{
SymbolsObservableCollection.Add(symbol);
}
Кажется, мы не можем дать доход в асинхронном методе, то какое решение я могу использовать? За исключением перемещения метода GetSymbols в мой проект WPF.