【发布时间】:2020-04-30 13:45:20
【问题描述】:
我有一个接受IEnumerable 并使用yield 运算符转换的方法返回它。要转换可枚举的一个元素,我首先需要知道另一个元素的值。因此,我想到了使用TaskCompletionSource 来创建类似“承诺”的东西。
这里的问题是,如果第一个TestFieldA 的值不是“a”,那么这段代码会导致死锁。一种解决方案是在将枚举传递给方法之前对其进行排序——在这种情况下,完全不需要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;
}
}
}
【问题讨论】:
标签: c# ienumerable taskcompletionsource iasyncenumerable