Viv*_*vek 12 c# ienumerable asynchronous task-parallel-library async-await
我有一个返回类型的方法:
public async Task<IEnumerable<T>> GetAll()
Run Code Online (Sandbox Code Playgroud)
它会进行一些进一步的异步调用(未知数),每个异步调用返回一个可枚举T的任务,然后想要连接返回的结果.
var data1 = src1.GetAll();
var data2 = src2.GetAll();
var data3 = src3.GetAll(); //and so on
Run Code Online (Sandbox Code Playgroud)
现在很容易等待所有并连接结果以生成单个可枚举,但我希望第一次调用返回时可枚举可用,如果任何调用仍然挂起,则可能等待调用者/枚举器可用的结果用完了.
我是否必须手动滚动一个concat,因为当它被包装在一个任务<>中时,缺乏枚举器支持?或者在TPL或其他地方已经有一个图书馆电话可以帮助我.我确实看过IX,但它仍处于试验版本,并且不想将其折叠起来.
在旁注,我正在尝试反模式?我可以想到一个复杂的,异常处理 - 从呼叫者的角度来看,呼叫可以成功完成并且他开始使用可枚举但它可以在中途爆炸...
有一个名为Async Enumerable的现有项目可以准确地解决这个问题.
你可以很容易地使用它.
例如:
IAsyncEnumerable<string> GetAsyncAnswers()
{
return AsyncEnum.Enumerate<string>(async consumer =>
{
foreach (var question in GetQuestions())
{
string theAnswer = await answeringService.GetAnswer(question);
await consumer.YieldAsync(theAnswer);
}
});
}
Run Code Online (Sandbox Code Playgroud)
这暴露了IAsyncEnumerable<string>一次产生的GetAnswer回报.您可以在内部公开一个IAsyncEnumerable<T>案例并在内部进行调用GetAll.
我正在尝试一种反模式?我可以想到一个复杂的,异常处理 - 从呼叫者的角度来看,呼叫可以成功完成并且他开始使用可枚举但它可以在中途爆炸...
我不会这么说.这确实存在潜在的问题,例如在其中一个等待期间内部发生异常,但这也可能发生在任何内部IEnumerable<T>.异步序列是当今新兴异步API的现实所需要的.