c# - 具有异步支持的进程同步/信令的互斥替代方案?

标签 c# mutex

除了Mutex之外,还有什么可以以容错方式同步两个进程吗?请耐心等待...

有一个进程A,它有点不稳定,它需要在后台启动进程B并继续。如果进程 A 成功完成其任务,它需要向进程 B 发出信号以进行处理,然后继续前进(它不会终止并且线程被重用)。如果进程 A 由于异常、终止等原因死亡,进程 B 需要快速检测到并自行处理。进程 A 不是一个“进程”,而是由各个主机执行的库,因此进程 B 不能只是等待进程 A 的名称消失。

输入互斥锁。

这里的进程A由测试夹具表示,如果成功,它将调用TestFixtureTearDown并继续,否则测试运行程序可能会被杀死并且TestFixtureTearDown永远不会执行。与实际过程一样,TestFixtureTearDown 可能由运行 TestFixtureSetUp 并创建互斥体的线程不同的线程调用,因此 ReleaseMutex 有时会抛出 ApplicationException:从不同步的代码块调用对象同步方法。

  1. 如果 TestFixtureTearDown 正在由不同的线程执行,我可以强制 ReleaseMutex 执行,或者以其他方式放弃互斥体吗?

  2. 是否有互斥体的替代方案可以用于这种容错“反向”等待/监视场景?最好不实现进程A向进程B发送心跳并且进程B跟踪间隔和超时?除了异步时偶尔出现的 ApplicationException 之外,互斥体感觉是一个非常优雅的解决方案。

.

namespace ClassLibrary1
{
    public class Class1
    {
        private Mutex _mutex;
        private Process _process;

        [TestFixtureSetUp]
        public void TestFixtureSetUp()
        {
            _mutex = new Mutex(true, "foo");
            _process = Process.Start("ConsoleApplication1.exe");
        }

        [Test]
        public void Test1() { /* Do stuff */ }

        [Test]
        public void Test2() { /* Do async stuff */ }

        [TestFixtureTearDown]
        public void TestFixtureTearDown()
        {
            _mutex.ReleaseMutex();
            _process.WaitForExit();
        }
    }
}

.

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var mutex = Mutex.OpenExisting("foo");

            // Start doing stuff

            try { mutex.WaitOne(); }
            catch (AbandonedMutexException) { }
            finally { mutex.ReleaseMutex(); }

            // Finish doing stuff
        }
    }
}

最佳答案

信号量没有线程关联性。您可以在与获取信号量不同的线程上释放信号量。使用计数为 1 的信号量。

关于c# - 具有异步支持的进程同步/信令的互斥替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26165388/

相关文章:

c# - 弹出窗口 web 浏览器控件

c# - Entity Framework 并加载所有数据库条目与根据需要加载每个数据库条目

c - 锁定互斥体时的 Pthread 优先级

c - try-lock 互斥调用与 CAS 调用

go - 测试信号量实现时出错

c++ - 如何分析基于 C++ STL 的程序以检测 STL 互斥锁?

c# - 将未命名的json数组反序列化为c#中的对象

c# - 如何在移动设备上管理大量数据

c# - SSAS Tabular AMO - 如何知道请求的刷新何时完成

c++ - 使用 std::lock (c++11) 的大量 CPU 负载