[英]Communication between Windows service and Windows form application
我正在做一个项目,它是一种文件上传器。 在项目中,有一些由应用程序创建并保存在特定文件夹中的日志文件。 这些文件的内容始终是文本。 这些文件的内容被上载到服务器,此任务由Windows服务完成。 该服务一个接一个地读取文件,然后将其内容传输到服务器。
以前,该任务以前是由应用程序本身完成的。 但这是与应用程序分开的,因为当应用程序运行时,用户可能处于脱机状态。 因此,这些文件将保持待上传状态。
使用服务的优势显而易见,用户不必担心上传的东西。 每当用户连接到Internet时,服务便会处理。
现在的要求是,当服务上载文件的内容并且正在运行通过其创建文件的应用程序时,该服务应向应用程序发送一条消息,指出正在上载哪个文件的内容。
现在的问题是服务和应用程序没有通信。 我从服务和应用程序中生成了单独的线程,这些线程都使用命名管道进行通信。
这是我尝试过的代码。
服务代码:
public partial class Service : ServiceBase
{
Thread t;
public Service()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
File.WriteAllText("D:\\log.txt", "Service started.\n");
ThreadStart ts = new ThreadStart(Connection);
t = new Thread(ts);
t.Start();
}
void Connection()
{
NamedPipeServerStream server = new NamedPipeServerStream("server");
server.WaitForConnection();
File.WriteAllText("D:\\log.txt", "Connection established.");
}
protected override void OnStop()
{
if (t.IsAlive)
{
t.Abort();
File.AppendAllText("D:\\log.txt", "Service stopped.");
}
}
}
应用代码:
public delegate void SendMsg(string s);
public partial class UI : Form
{
Thread t;
public UI()
{
InitializeComponent();
}
private void UI_Load(object sender, EventArgs e)
{
lblStatus.Text = "Waiting...";
ThreadStart ts = new ThreadStart(Connection);
t = new Thread(ts);
t.Start();
}
void DisplayMsg(string s)
{
lblStatus.Text = s;
}
void Connection()
{
try
{
NamedPipeClientStream client = new NamedPipeClientStream("server");
SendMsg msg = new SendMsg(DisplayMsg);
msg("Connecting...");
client.Connect();
msg("Connected");
}
catch (Exception ex)
{
File.WriteAllText("D:\\log.txt", ex.Message);
}
}
}
这段代码有什么问题?
如果我使用另一个表单应用程序代替服务,则相同的逻辑也有效。
在进行此搜索时,我了解到Windows Vista以后版本的Windows中的会话0,该会话专门用于Windows服务,并且与登录用户使用的其他会话隔离。 我在系统中使用Windows 8。 这可能是个问题吗? 请详细说明。
我承认我不是很多有关命名管道的专家。 我对它们的唯一经验是通过Windows Communication Foundation (WCF)进行的,尽管这些问题可能是因为我做错了,但我还是遇到了间歇性的问题。 因此,我无法明智地谈论您的命名管道问题。 我确实知道, 汉斯·帕桑特(Hans Passant)一言以蔽之,通常最好留意。
综上所述,如果您希望通信要求保持简单,那么使用命名管道(套接字,内存映射文件等)并没有错。 当然,如果服务与应用程序之间的通信有望增长,那么考虑使用WCF之类的更正式的东西可能是有意义的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.