我正在开发一个项目,它是一种文件上传器。在项目中,某些日志文件由应用程序创建并保存在特定文件夹中。这些文件的内容始终是文本。这些文件的内容将上载到服务器,此任务由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。这可能是个问题吗?请详细解释。
答案 0 :(得分:0)
我承认我不太喜欢命名管道。我对它们的唯一体验是通过Windows Communication Foundation(WCF),我遇到了间歇性问题,尽管可能是因为我做错了。所以我不能聪明地说出你的命名管道问题。我知道,当Hans Passant提出建议时,通常最好注意它。
所有这一切,如果您希望通信要求保持简单,使用命名管道(套接字,内存映射文件等)没有任何问题。当然,如果预计服务和应用程序之间的通信会增长,那么考虑像WCF这样更正式的东西可能是有意义的。