我有一个控制台应用程序正在与 ftp 服务器进行长时间的同步。
另一个控制台应用程序准备一个本地文件系统,其中包含一些需要的更新文件。
然后第二个将等待第一个完成,然后交换最终目录名称,使其在网络上可见。
我搜索了使同步应用程序与第二个应用程序通信它已完成工作的最佳方法。看起来为 IPC 使用数据复制是最适合此问题的解决方案。
问题有两个:
- 我对吗?有没有更直接的方法来获得相同的结果?
- 是否有托管(.net)方式来做到这一点?
我有一个控制台应用程序正在与 ftp 服务器进行长时间的同步。
另一个控制台应用程序准备一个本地文件系统,其中包含一些需要的更新文件。
然后第二个将等待第一个完成,然后交换最终目录名称,使其在网络上可见。
我搜索了使同步应用程序与第二个应用程序通信它已完成工作的最佳方法。看起来为 IPC 使用数据复制是最适合此问题的解决方案。
问题有两个:
如果您只需要通知一个应用程序另一个已完成其任务,那么最简单的方法是使用命名的 EventWaitHandle。该对象是在其未发出信号的状态下创建的。第一个应用程序在句柄上等待,第二个应用程序在完成工作时向句柄发出信号。例如:
// First application
EventWaitHandle waitForSignal = new EventWaitHandle(false, EventResetMode.ManualReset, "MyWaitHandle");
// Here, the first application does whatever initialization it can.
// Then it waits for the handle to be signaled:
// The program will block until somebody signals the handle.
waitForSignal.WaitOne();
这设置了第一个等待同步的程序。第二个应用同样简单:
// Second app
EventWaitHandle doneWithInit = new EventWaitHandle(false, EventResetMode.ManualReset, "MyWaitHandle");
// Here, the second application initializes what it needs to.
// When it's done, it signals the wait handle:
doneWithInit.Set();
当第二个应用程序调用 Set 时,它会发出事件信号,第一个应用程序将继续。
IPC 的其他流行选项包括:
如果您只需要同步,您可以考虑使用Semaphore
、 或Mutex
对象。.NET的命名空间中存在一些类,System.Threading
如果您创建它们的命名版本,那么它们将应用于整个机器。