异步启动/停止状态转换

时间:2015-12-21 20:41:50

标签: c# algorithm asynchronous async-await state-machine

我有一个带有异步启动和停止方法的第三方对象。每次启动和停止都可能会失败,但例外。该对象不是可重入的,即我只能在上一次启动/停止完成后调用其启动或停止方法。

我需要有一个类来处理转换到正确(=最后询问)状态,同时最小化转换次数,允许我的客户端随时从任何线程提交任意数量的启动/停止请求。 / p>

目前,我已经在异步方法中将该功能实现为无限循环,但是它过于复杂,循环超过4页,每次迭代我都需要在8个状态之间手动切换(以下3位:需要启动/停止,尝试启动/停止,确实失败/成功)。闻起来。

我有一种感觉,我可能会遗漏一些明显的东西。 而且我的代码看起来有点类似于编译异步函数时编译器的作用。 有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

听起来你需要在呼叫周围使用互斥锁。您需要阻止任何其他代码调用这些方法,直到方法返回(或表明它们已完成)。

我只需要包装对象并为调用添加一个互斥锁。这样你可以保证,如果你不同时打两个电话。

您无需阻止互斥锁。您可以使用类似生产者/消费者队列或线程池的内容来同步访问。

如果您处于单线程环境中,您也可以使用简单队列(并跳过所有多线程对象)来执行此操作。