我正在尝试设计一个异步组件。这一构成部分的所需资源如下:
到目前为止,我已经试过/想过:
我正在寻找的是可能的其他解决方案的建议,我可能没有想到。或建议的解决方案的其他优点/缺点。
发布于 2017-03-15 10:48:28
我认为可观察是正确的模式。
使用async/await推断的诺言/任务/未来/延迟最适合于需要跟踪的单个事件(或分支逻辑链事件)。你将需要很多额外的工作,以使它适合你的情况。
大多数实现都在幕后使用生成器*/IEnumerable/iterator,await变成yield new Promise/yield return new Task,调用编码被转换为承诺/任务的枚举数。
Rx/观察力更适合于事件可以反复触发的情况,并且您希望将它们作为一个随时间迭代的集合来处理。
您可以使用自己的类来处理这个问题(可能使用async/await),但是您必须解决Rx已经存在的许多相同的问题,同时又不能节省任何复杂性。
发布于 2017-06-13 13:02:26
您的解决方案可能太复杂,因为它本身做的太多了。例如,如果将长期运行任务(AKA作业)管理拆分为自己的组件,则可以将交互限制在管理这些任务上。类似地,临时事件处理组件可能需要使用作业管理器,但将测试限制在这些事件上可以使处理起来更加容易。我自己也做过几个项目。
您处理测试的方式是通过几个精心选择的接口。该实现可以是您的反应性可观察性,也可以是自定义实现,这取决于您的实际需求。IJob接口可以如下所示:
public interface IJob
{
string Id { get; }
bool IsRunning { get; }
Task Handle { get; }
void Cancel();
// and anything else you need.
}您还可以制作一个类型化版本来处理返回值的任务。
底线是,您可能只需要系统中长期运行的任务管理组件之一。您可以轻松地测试与该组件的所有交互,也可以相当容易地测试组件本身。由于Handle属性公开了一个Task,所以您可以很容易地获得代码,这些代码将简单地将作业交给await来完成。
我还没有使用反应性可观察性,但是您可以提供一个Task句柄,它可以很容易地使用TaskCompletionSourceTaskCompletionSource连接到一个简单的结果。在作业内部,您可以在需要显式时设置结果或错误状态,而外部代码并不明智。TaskCompletsionSource有一个Task属性,可以用于上面的Handle。
您可以根据需要拥有尽可能多的“临时”组件,只要它们有一个一致的方法来管理长期任务,就应该将设计简化为每个人都能理解的东西。
https://softwareengineering.stackexchange.com/questions/344153
复制相似问题