假设我写了一个Windows服务,有时会将某些文件备份到某个地方。 用户打开我的应用程序XYX,我希望他收到通知,告诉你那里有新的备份文件。
这就是全部。这就是场景。
答案 0 :(得分:1)
使用MSMQ,因为它非常简单,您可以使用对象。然后,生产者和消费者可以非常简单地相互交互。这两个应用程序(Producer,COnsumer)可以在同一台机器上,通过网络,甚至在不总是连接的不同机器上。 MSMQ被认为是故障安全的,因为如果第一次传输失败,它将重试发送消息。这使您可以非常确信您的应用程序消息将到达目的地。
答案 1 :(得分:1)
我们在最近的项目中使用了命名管道用于类似目的。代码结果非常简单。我不能声称这个特定的代码,但它是:
/// <summary>
/// This will attempt to open a service to listen for message requests.
/// If the service is already in use it means that another instance of this WPF application is running.
/// </summary>
/// <returns>false if the service is already in use by another WPF instance and cannot be opened; true if the service sucessfully opened</returns>
private bool TryOpeningTheMessageListener()
{
try
{
NetNamedPipeBinding b = new NetNamedPipeBinding();
sh = new ServiceHost(this);
sh.AddServiceEndpoint(typeof(IOpenForm), b, SERVICE_URI);
sh.Open();
return true;
}
catch (AddressAlreadyInUseException)
{
return false;
}
}
private void SendExistingInstanceOpenMessage(int formInstanceId, int formTemplateId, bool isReadOnly, DateTime generatedDate, string hash)
{
try
{
NetNamedPipeBinding b = new NetNamedPipeBinding();
var channel = ChannelFactory<IOpenForm>.CreateChannel(b, new EndpointAddress(SERVICE_URI));
channel.OpenForm(formInstanceId, formTemplateId, isReadOnly, generatedDate, hash);
(channel as IChannel).Close();
}
catch
{
MessageBox.Show("For some strange reason we couldnt talk to the open instance of the application");
}
}
在我们的OnStartup中,我们只是
if (TryOpeningTheMessageListener())
{
OpenForm(formInstanceId, formTemplate, isReadOnly, generatedDate, hash);
}
else
{
SendExistingInstanceOpenMessage(formInstanceId, formTemplate, isReadOnly, generatedDate, hash);
Shutdown();
return;
}
答案 2 :(得分:0)
有很多方法可以实现您的要求;