我有一个控制台应用程序正在与ftp服务器进行一些冗长的同步.
另一个控制台应用程序准备一个本地文件系统与一些所需的更新文件
然后第二个将等待第一个完成,然后交换最终目录名称,以便它在Web上可见.
我搜索了使同步应用程序与第二个应用程序进行通信的最佳方法,即它完成了它的工作.看起来像使用IPC的数据复制是最适合的解决方案.
问题有两个:
我对吗?是否有更直接的方法来获得相同的结果?
是否有托管(.net)方式来执行此操作?
Jim Mischel.. 10
如果您只需要通知一个应用程序另一个已完成其任务,则最简单的方法是使用命名的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时,它会发出事件信号,第一个应用程序将继续.
如果您只需要通知一个应用程序另一个已完成其任务,则最简单的方法是使用命名的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的其他流行选项包括:
命名管道
远程处理(.NET)
WCF
如果您只需要同步,则可以考虑a Semaphore
或Mutex
对象.System.Threading
.NET命名空间中存在类如果您创建这些类的命名版本,则它们将应用于整个计算机.