如何通过Rx测试防止挂起?

问题描述 投票:0回答:1

我正在通过以下简化的测试用例重现我的Rx问题。下面的测试挂起。我确信这是我所缺少的很小但基本的东西,但是不能用手指指着它。

   public class Service
   {
        private ISubject<double> _subject = new Subject<double>();
        public void Reset()
        {
            _subject.OnNext(0.0);
        }

        public IObservable<double> GetProgress()
        {
            return _subject;
        }
    }

    public class ObTest
    {
        [Fact]
        private async Task SimpleTest()
        {
            var service = new Service();

            var result = service.GetProgress().Take(1);

            var task = Task.Run(async () =>
            {
                service.Reset();
            });

            await result;
        }
    }
system.reactive
1个回答
0
投票

您的代码未挂起。它正在等待可观察到的东西,有时甚至永远无法获得价值。

您有比赛条件。

Task.Run有时会在await result创建可观察对象的预订之前执行完毕,因此它永远不会看到该值。

尝试使用此代码:

private async Task SimpleTest()
{
    var service = new Service();

    var result = service.GetProgress().Take(1);

    var awaiter = result.GetAwaiter();

    var task = Task.Run(() =>
    {
        service.Reset();
    });

    await awaiter;
}
© www.soinside.com 2019 - 2024. All rights reserved.