Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步启动/停止状态转换_C#_Algorithm_Asynchronous_Async Await_State Machine - Fatal编程技术网

C# 异步启动/停止状态转换

C# 异步启动/停止状态转换,c#,algorithm,asynchronous,async-await,state-machine,C#,Algorithm,Asynchronous,Async Await,State Machine,我有一个具有异步启动和停止方法的第三方对象。每次启动和停止可能会出现异常故障。对象不是可重入的,即,我只能在上一次启动/停止完成后调用其启动或停止方法 我需要有一个类来处理这些转换到正确(=上次询问)状态的转换,同时最小化转换的数量,允许我的客户机在任何时候从任何线程提交任意数量的启动/停止请求 目前,我已经在异步方法中将该功能实现为无止境循环,但是它太复杂了,循环超过4页长,在每次迭代中,我需要在8个状态之间手动切换(具有以下3位:需要启动/停止、尝试启动/停止、失败/成功)。闻起来很香 我有

我有一个具有异步启动和停止方法的第三方对象。每次启动和停止可能会出现异常故障。对象不是可重入的,即,我只能在上一次启动/停止完成后调用其启动或停止方法

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

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

我有一种感觉,我可能错过了一些明显的东西。 而且,我的代码看起来有点类似于编译器在编译异步函数时所做的工作。
有更好的方法解决这个问题吗?

听起来您需要在通话中使用互斥锁。您需要阻止任何其他代码调用这些方法,直到这些方法返回(或发出完成的信号)

我将简单地包装对象并为调用添加互斥体。这样你就可以保证如果你不同时打两个电话

您不需要阻塞互斥对象。您可以使用生产者/消费者队列或线程池之类的东西来同步访问


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

是否可以显示/共享代码?“也许它更适合你?”朗克莱感谢你的建议。我会问我的客户他们是否同意,如果同意,他们会尝试代码审查。@RonKlein客户说他们可以共享特定的类。代码是这样的:我用监视器来保护我的状态。环境是多线程的,我的代码运行在CLR池线程上,也在媒体基础工作线程上运行。如果我使用一个队列,客户端将快速提交3个请求开始,然后停止,然后开始,我将启动3个状态转换,而在这种情况下,我只需要启动一个状态转换。正如您在问题中所说,您想要最后一个被问到的状态,请在发出状态更改之前修改请求队列以清空它(并忽略除最后一个之外的所有内容)。您不认为只保存最后一个值的队列可以替换为一个bool变量吗?为什么要使用queue?