Windows服务和Windows表单应用程序之间的通信

时间:2014-01-04 09:54:36

标签: c# windows-services ipc

我正在开发一个项目,它是一种文件上传器。在项目中,某些日志文件由应用程序创建并保存在特定文件夹中。这些文件的内容始终是文本。这些文件的内容将上载到服务器,此任务由Windows服务完成。该服务逐个读取文件,然后将其内容传输到服务器。

此前,此任务曾由应用程序本身完成。但它与应用程序分离,因为当应用程序运行时,用户可能处于脱机状态。因此,这些文件将保持待上传状态。

使用服务的好处显而易见,用户不必担心上传内容。只要用户连接到互联网,服务就会处理它。

现在的要求是,当服务上传文件的内容和当时正在运行创建文件的应用程序时,服务应该向应用程序发送一条消息,告知该文件的内容正在上传。

现在问题是服务和应用程序没有通信。我已经从服务和应用程序中生成单独的线程,这些线程正在使用namedpipes进行通信。

这是我尝试过的代码。

服务代码:

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。这可能是个问题吗?请详细解释。

1 个答案:

答案 0 :(得分:0)

我承认我不太喜欢命名管道。我对它们的唯一体验是通过Windows Communication Foundation(WCF),我遇到了间歇性问题,尽管可能是因为我做错了。所以我不能聪明地说出你的命名管道问题。我知道,当Hans Passant提出建议时,通常最好注意它。

所有这一切,如果您希望通信要求保持简单,使用命名管道(套接字,内存映射文件等)没有任何问题。当然,如果预计服务和应用程序之间的通信会增长,那么考虑像WCF这样更正式的东西可能是有意义的。