2015-12-21 87 views
-1

我有一个具有异步启动和停止方法的第三方对象。每个启动和停止都可能失败,并有异常。该对象不可重入,即,在上一次启动/停止完成后,我只能调用其启动或停止方法。异步启动/停止状态转换

我需要有一个处理这些过渡到正确的(=最后问)状态的类,同时尽量减少转换的数量,让我的客户从任何线程在任何时间提交开始的任何数量/停止请求。

目前,我已经在async方法中实现了无限循环的功能,但是它太复杂了,循环超过4页长,每次迭代时我需要在8个状态之间手动切换(使用以下3位:需要启动/停止,尝试启动/停止,失败/成功)。它闻起来臭臭的。

我有一种感觉,我可能会错过这里明显的东西。 此外,我的代码看起来有点类似于编译异步函数时的编译器。 有没有更好的方法来解决这个问题?

+0

你能展示/分享代码吗?也许它更适合http://codereview.stackexchange.com/? –

+0

@RonKlein谢谢你的建议。我会问我的客户他们是否可以,如果是的话,会尝试codereview。 – Soonts

+0

@RonKlein客户说他们可以分享那个特定的课程。这是代码:http://codereview.stackexchange.com/q/114764/46194 – Soonts

回答

0

听起来像你需要一个互斥的电话。您需要阻止任何其他代码调用这些方法,直到方法返回(或表示它们已完成)。

我会简单地包装对象并为调用添加一个互斥锁。这样,如果您不同时拨打两个电话,您可以保证。

你不需要阻塞互斥体。你可以使用像生产者/消费者队列或线程池这样的东西来同步访问。

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

+0

我使用监视器来保护我的状态。 环境非常多线程,我的代码在CLR池线程上运行,也在Media Foundation工作线程上运行。 如果我将使用一个队列,并且客户端将快速提交3个请求start,然后停止,然后启动,我将有3个状态转换启动停止启动,而在这种情况下,我只需要一个,即可开始。 – Soonts

+0

正如你在问题中所说的那样,你需要最后一个询问状态,修改你的请求队列以在发出状态改变之前将其清空(并且忽略除最后一个状态之外的所有内容)。 – Sorin

+0

难道你不认为只有最后一个值的队列可以被一个单一的bool变量替换吗?为什么要使用队列? – Soonts