在关于async/await的stackoverflow之前的一个问题之后,在我看来,await比营销建议的更强大和更通用.它似乎是构建计算表达式的一般方法,就像在F#中一样.所以经过一番努力,我想出了一些成功执行的代码,如下所示.
using FluentAssertions;
using System.Collections.Generic;
namespace EnumerableViaAwait.Specs
{
[global::Microsoft.VisualStudio.TestTools.UnitTesting.TestClass]
public class MyTestClass
{
public IEnumerable<int> Numbers()
{
return EnumeratorMonad.Build<int>(async Yield =>
{
await Yield(11);
await Yield(22);
await Yield(33);
});
}
[Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod]
public void TestEnum()
{
var v = Numbers();
var e = v.GetEnumerator();
int[] expected = { 11, 22, 33 };
Numbers().Should().ContainInOrder(expected);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在仔细注意这里发生了什么.我不构建反应性观察.我正在构建一个IEnumerable.它严格来说是拉动系统.我很乐意写作.
foreach item in Numbers(){
Console.WriteLine(item);
}
Run Code Online (Sandbox Code Playgroud)
它会打印出来
11
22
33
Run Code Online (Sandbox Code Playgroud)
这非常有趣,因为系统不是严格异步的,但我滥用了await框架和"等待任何东西"的能力,如此处所述.http://blogs.msdn.com/b/pfxteam/archive/2011/01/13/10115642.aspx. 问题是.
实现该模式的代码如下
using System;
using System.Collections.Generic; …Run Code Online (Sandbox Code Playgroud)