我有在C#.NET 3.5中开发的客户端-服务器应用程序。该应用程序使用3个程序来完成所需的工作。进程A(服务器)和进程B(远程启动器)是在.NET中开发的,进程C是第三方控制台应用程序,其开发语言未知。使用远程计算机的管理凭据,进程A在其上复制进程B,并将进程B安排为远程计算机上的任务。此后,进程B由任务计划程序启动,并创建log.txt
文件来记录消息。然后,进程B使用Process.Start()
语义启动进程C,并重定向其standard output and error
写入log.txt
文件。进程A使用Process.GetProcesses(remotecomputername)
语义来监视进程C是否仍在远程计算机上运行。
进程A还使用类似于log.txt
的网络共享读取\\RemoteComputerName\C$\RemoteDir\log.txt
文件,并在其窗口中显示消息。
我的问题是,所有输出和错误都未登录log.txt
。并且进程A无法从log.txt
正确读取。如果使用DebugView记录了输出/错误,则说明它们已正确记录。是否存在同步/访问权限问题?如何摆脱它?
任何指针/提示将是真正有价值的。由于限制,无法共享完整代码。
下面提供了示例代码
过程A
//Below method is called every 2 seconds from Server to read new messages.
//path passed as `\\RemoteComputerName\C$\RemoteDir\log.txt`
private void ReadRemoteLog(string path)
{
try
{
string[] lines = File.ReadAllLines(path);
while (RemoteLogPosition < lines.LongLength)
{
string msg = lines[RemoteLogPosition].Trim();
if (!string.IsNullOrEmpty(msg))
{
Trace.WriteLine("# " +msg); //Writing on DebugView
OnProgressChanged(msg);
}
RemoteLogPosition++; //This is global variable to keep track of last read position.
}
}
}
进程B的启动进程C的代码
ProcessStartInfo ps = new ProcessStartInfo();
ps.UseShellExecute = false;
ps.FileName = <Path to process C>;
ps.Arguments = <Commandline args to Process C>;
ps.WorkingDirectory = @"C:\RemoteDir";
ps.RedirectStandardError = true;
ps.RedirectStandardOutput = true;
Process p = new Process();
p.StartInfo = ps;
p.OutputDataReceived += (s, e) => { WriteLog(e.Data.Trim());};
p.ErrorDataReceived += (s, e) => { WriteLog(e.Data.Trim()); };
p.Start();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
WriteLog("Process Started - "+ps.FileName + ps.Arguments);
p.WaitForExit();
进程B的WriteLog方法-
private void WriteLog(string message)
{
using (FileStream fs = new FileStream(@"C:\\RemoteDir\log.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Inheritable))
using(StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine("#" + message);
}
}
答案 0 :(得分:1)
记住文件在写入时会获得排他锁。 因此,如果两个线程同时写入,则其中一个将陷入异常。 阅读不是问题。 简单的解决方案是制作多个日志文件或使用数据库。 另一种方法是保持消息累积并在一个小时内或消息达到100条时写入一次。 列出字符串
def my_view(request):
return render(request,
'your-template.html',
context=your_context,
status=204) # your custom status in this case 204
另一种方法是异步写入。 您可能会丢失顺序。
List<string> messagelst= new List<string>();
private void WriteLog(string message)
{
messagelst.Add("New York");
messagelst.Add("Mumbai");
messagelst.Add("Berlin");
messagelst.Add("Istanbul");
if(messagelst.length==100){
string message= string.Join(",", messagelst.ToArray());
using (FileStream fs = new FileStream(@"C:\\RemoteDir\log.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Inheritable))
using(StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine("#" + message);
}
messagelst= new List<string>();
}
}