除了Mutex
之外,还有什么可以以容错方式同步两个进程吗?请耐心等待...
有一个进程A,它有点不稳定,它需要在后台启动进程B并继续。如果进程 A 成功完成其任务,它需要向进程 B 发出信号以进行处理,然后继续前进(它不会终止并且线程被重用)。如果进程 A 由于异常、终止等原因死亡,进程 B 需要快速检测到并自行处理。进程 A 不是一个“进程”,而是由各个主机执行的库,因此进程 B 不能只是等待进程 A 的名称消失。
输入互斥锁。
这里的进程A由测试夹具表示,如果成功,它将调用TestFixtureTearDown
并继续,否则测试运行程序可能会被杀死并且TestFixtureTearDown
永远不会执行。与实际过程一样,TestFixtureTearDown
可能由运行 TestFixtureSetUp
并创建互斥体的线程不同的线程调用,因此 ReleaseMutex
有时会抛出 ApplicationException:从不同步的代码块调用对象同步方法。
如果
TestFixtureTearDown
正在由不同的线程执行,我可以强制ReleaseMutex
执行,或者以其他方式放弃互斥体吗?是否有互斥体的替代方案可以用于这种容错“反向”等待/监视场景?最好不实现进程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/