繁体   English   中英

Windows服务和Windows窗体应用程序之间的通信

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM