我正在通过以下简化的测试用例重现我的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;
}
}
您的代码未挂起。它正在等待可观察到的东西,有时甚至永远无法获得价值。
您有比赛条件。
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;
}