gpt4 book ai didi

c# - 为非线程安全类创建一个可观察的包装器

转载 作者:太空狗 更新时间:2023-10-29 19:26:36 24 4
gpt4 key购买 nike

我有课,

public class Test
{
public int Calc();
}

这要求对 Calc 的所有调用都在与创建 Test 的线程相同的线程上执行。我需要创建一次 Test(昂贵的操作)并多次调用 Calc。

我想要一个可以让我异步调用 Calc 的包装器:

public class TestWrapper
{
private Test _test;
public IObservable<int> Calc();
}

一种方法是创建一个 BackgroundWorker 或一个 Thread,并使用它来保证 Test 上的所有操作都在同一个线程上。为简单起见,我们可以假设所有对 Calc() 的调用都将按顺序执行,因此无需担心排队。

是否有更优雅的 RX 方式来做到这一点?

最佳答案

如果在创建 TestWrapper 时可以创建 Test 那么这个类似乎可以满足您的要求:

public class TestWrapper
{
public TestWrapper(Func<Test> factory)
{
_scheduler = new EventLoopScheduler();
_test = Observable.Start(factory, _scheduler).First();
}

private readonly EventLoopScheduler _scheduler;
private readonly Test _test;

public IObservable<int> Calc()
{
return Observable.Start(() => _test.Calc(), _scheduler);
}
}

它是这样使用的:

var testWrapper = new TestWrapper(() => new Test());
testWrapper.Calc().Subscribe(x => { });

我已经对其进行了测试,它在执行 Calc 的同一线程上创建了 Test。另一方面,订阅是在与创建 testWrapper 本身相同的线程(即调用线程)上处理的。

关于c# - 为非线程安全类创建一个可观察的包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com