为什么不调用Rx.NET Finally块?

时间:2015-08-02 00:47:40

标签: c# system.reactive

请注意以下简单的Rx.NET程序:

using System;
using System.Diagnostics;
using System.Reactive.Linq;

namespace observables
{
    class Program
    {
        static void Main()
        {
            var src = Observable
                .Interval(TimeSpan.FromMilliseconds(1))
                .Take(1)
                .Do(o => Debug.WriteLine(o))
                .Finally(() => Debug.WriteLine("************ Finally"));
            src.GetAwaiter().GetResult();
        }
    }
}

显示:

0
************ Finally

现在,当我从monad中删除Do块时,程序不会显示任何内容!

为什么?

1 个答案:

答案 0 :(得分:2)

Observable线程和主线程之间存在竞争条件。

函数调用src.GetAwaiter().GetResult();不会等待Observables Finally,因为它在不同的线程上运行。

尝试多次运行:您会看到Debug.WriteLine偶尔成功,至少在我的Visual Studio设置上。