相关疑难解决方法(0)

之前是否发现了在C#中使用async/await?

在关于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. 问题是.

  1. 这种滥用await/async会走多远?
  2. 这种模式是否与F#计算表达式一样强大
  3. 传统的IEnumerator/Yield模式只是语法糖,它完全评估这种模式

实现该模式的代码如下

    using System;
    using System.Collections.Generic; …
Run Code Online (Sandbox Code Playgroud)

c# monads asynchronous async-await visual-studio-2012

5
推荐指数
1
解决办法
1238
查看次数