C#WinForms:两个应用程序有几种方法可以一起交谈,我在这方面不是很了解,但我想到了 MSMQ 和命名管道之类的东西,但不确定哪种方法最好。所以这是一个场景,你认为最好的方法是什么:
假设我编写了一个 Windows 服务,它有时会将一些文件备份到某个地方。用户打开了一些我的应用程序 XYX,我希望他得到通知,嘿那里有新的备份文件给你。
就这样。这就是情景。
C#WinForms:两个应用程序有几种方法可以一起交谈,我在这方面不是很了解,但我想到了 MSMQ 和命名管道之类的东西,但不确定哪种方法最好。所以这是一个场景,你认为最好的方法是什么:
假设我编写了一个 Windows 服务,它有时会将一些文件备份到某个地方。用户打开了一些我的应用程序 XYX,我希望他得到通知,嘿那里有新的备份文件给你。
就这样。这就是情景。
使用 MSMQ,因为它实现起来非常简单,您可以使用对象。然后生产者和消费者可以非常简单地相互交互。这两个应用程序(生产者,消费者)可以在同一台机器上,跨网络,甚至在不总是连接的不同机器上。MSMQ 被认为是故障安全的,因为如果第一次传输失败,它将重试发送消息。这使您可以非常确信您的应用程序消息将到达其目的地。
我们刚刚在最近的一个项目中将命名管道用于类似目的。代码变得非常简单。我不能为这个特定的代码申请功劳,但这里是:
/// <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;
}
有很多方法可以实现您的要求;