我有一个接受 anIEnumerable
并返回使用 yield 运算符转换的方法。要转换可枚举的一个元素,我首先需要知道另一个元素的值。因此,我想到了使用 aTaskCompletionSource
来创建类似“promise”的东西。
这里的问题是,如果“a”以外的任何值是 first 的值,则此代码会导致死锁TestFieldA
。一种解决方案是在将枚举传递给方法之前对其进行排序——在这种情况下,完全不需要TaskCompletionSource
。但是,我想知道是否可以在没有这个的情况下完成。我也知道这可以通过一些 LINQ 查询来完成,但这需要多次枚举输入,我想避免这种情况。
这就是我想要达到的目标。(仅适用于第一个TestFieldA == "a"
)
class Test
{
public string TestFieldA {get;set;}
public int TestFieldB {get;set;}
}
private async IAsyncEnumerable<Test> Transform(IEnumerable<Test> inputEnumerable)
{
var tcs = new TaskCompletionSource<int>();
foreach(var input in inputEnumerable)
{
if (input.TestFieldA == "a")
{
tcs.SetResult(input.TestFieldB);
yield return input;
}
else
{
input.TestFieldB -= await tcs.Task;
yield return input;
}
}
}