如何使用System.Diagnostics.PerformanceCounter跟踪进程的内存和CPU使用情况?
现在我正在使用Process.Kill()来杀死进程.有没有办法,而不是立即杀死它,我可以向进程发送一条消息,指示它关闭,以便它可以优雅地清理和关闭.基本上,我正在寻找仅仅点击右上角的红色X的等价物,我相信它会向请求关闭的应用程序发送消息.
我在针对.Net framework 3.5的程序中有一个System.Diagnostics.Process对象
我已经重定向了两个StandardOutput和StandardError管道,我正在异步地从它们接收数据.我还为Exited事件设置了一个事件处理程序.
一旦我打电话,Process.Start()我想在等待事件被提出的时候去做其他工作.
不幸的是,对于返回大量信息的进程,似乎在最后一个OutputDataReceived事件之前触发了Exited 事件.
我怎么知道OutputDataReceived收到最后一次的时间?理想情况下,我希望这次Exited活动成为我收到的最后一次活动.
这是一个示例程序:
using System;
using System.Diagnostics;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string command = "output.exe";
string arguments = " whatever";
ProcessStartInfo info = new ProcessStartInfo(command, arguments);
// Redirect the standard output of the process.
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
// Set UseShellExecute to false for redirection
info.UseShellExecute = false;
Process proc = …Run Code Online (Sandbox Code Playgroud) 我在日志记录中看到了许多其他问题.最佳做法.什么日志记录平台最好.等等.这里有一些关于SO的链接以及关于该主题的非常好的讨论:
开始编辑:
键入这篇长篇文章后,我想我想弄清楚的主要是WCF日志/跟踪和活动ID传播与System.Diagnostics和TraceSources的紧密耦合.您是否可以使用第三方日志记录平台(如log4net或NLog)获得"良好"的WCF日志记录/跟踪和活动ID传播.如果你这样做,你怎么做?
有关ServiceTraceViewer的一些问题,请参阅本文的底部,
结束编辑.
我的问题的主题在任何这些帖子中都没有详细讨论.我对人们在日志记录和WCF方面做了什么感兴趣.如果您正在处理包含WCF服务的项目并且已登录项目,那么您是否需要特别努力来使用特定于WCF的日志记录功能.特别是,您是否尝试合并活动跟踪,活动传播和端到端跟踪等内容?如MSDN 中的这篇文章所述. 这是MSDN关于传播活动的另一篇文章.
这篇文章很好地解释了如何使用System.Diagnostics TraceSources进行活动跟踪,活动传播和端到端跟踪.它显示了如何配置WCF以通过app.config/web.config文件"打开"这些选项.WCF在内部使用TraceSources来记录通信结果.
下面是一些示例代码(来自上面链接的第二篇MSDN文章),它或多或少地显示了如何通过System.Diagnostics和TraceSources实现活动传播:
TraceSource ts = new TraceSource("myUserTraceSource");
Guid oldID = Trace.CorrelationManager.ActivityId;
Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; // Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");
double value1 = 100.00D;
double value2 = 15.99D;
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2);
double result = client.Add(value1, value2);
ts.TraceInformation("Client receives Add response '" + …Run Code Online (Sandbox Code Playgroud) 我正在使用Process类来运行exe.
exe是我无法控制的第三方控制台应用程序.
我想知道进程是否在命令行上等待输入.
如果它有任何区别,我打算在应用程序等待输入时终止它.
当程序的输出等待读取时,有适当的事件,但是当过程耐心地等待输入时,我看不到任何类似的事件.
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "myapp.exe";
info.CreateNoWindow = true;
info.UseShellExecute = false;
info.RedirectStandardError = true;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
process.StartInfo = info;
process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
Run Code Online (Sandbox Code Playgroud)
如何检测我的进程正在等待输入?
我正在调查.net项目的各种日志记录可能性,我无法在System.Diagnostics.Debug/Trace功能和第三方库(如log4net,MS Enterprise Library,NLog等)之间做出决定.
目前我已经发现了这个:
如果有人能指出我正确的方向或纠正(或添加一些东西)给我上面给出的比较,我将非常感激!也许如果你鼓励我使用第三方,你可以建议一些特定的一方(考虑到我们的应用程序很可能不需要任何花哨的东西,如UDP,滚动文件等 - 只是普通文件,电子邮件,数据库和事件簿)?
提前致谢!
以下代码:
static void Main(string[] args)
{
TraceSource ts = new TraceSource("MyApplication");
ts.Switch = new SourceSwitch("MySwitch");
ts.Switch.Level = SourceLevels.All;
ts.Listeners.Add(new TextWriterTraceListener(Console.Out));
ts.TraceInformation("Hello World");
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
生成以下输出:
MyApplication信息:0:Hello World
跟踪输出开头的"MyApplication Information:0:"部分来自TraceSource类本身.
但是,我需要在行的开头有一个时间戳,我想将"信息"更改为"信息".
有没有办法在跟踪输出中获得更多自由,这样我可以将其配置为:
13:03:00 - MyApplication Info:Hello World
我尝试了几个小时,但没有成功.无论我做什么,在输出行的开头,始终有这个常量预定义的"MyApplication Information:0:Hello World"输出.
MSDN文档也没有透露任何有用的信息.
在Trace.Write("");开发MVC或WCF应用程序时,您在哪里看到日志?什么是正确的地方?
我们最初没有使用任何日志记录或调试跟踪,但在花了几周时间追踪一些数据损坏后,我们决定将生成所需的Debug.Write和Trace以及Debug.Assert
那么现在问题是使用调试和跟踪日志记录的最佳实践是什么.我只是在寻找一些通用的东西.
public void AddRectodatabase(object record)
{
Debug.WriteLine(record.ToString());
Trace.WriteLine(record.ToString());
// Add it to databse
Debug.Assert(true, "Use this on case by case basis");
}
Run Code Online (Sandbox Code Playgroud)
这对于一般用途是否足够好,我在那里做错了吗?
我们希望坚持.net System.Diagnostics而不是像log4net这样的其他选择.
System.Diagnostics中还有其他有用的东西吗?
我可以通过StackTrace获取有关参数的信息,使用类似的方法:
catch (Exception ex)
{
var st = new StackTrace(ex);
System.Reflection.ParameterInfo pi = st.GetFrame(0).GetMethod().GetParameters().First();
}
Run Code Online (Sandbox Code Playgroud)
我想知道我如何获得参数的值.例:
如果我在堆栈跟踪中的方法是这样的:
void MyMethod(object value)
Run Code Online (Sandbox Code Playgroud)
电话就像:
MyMethod(10);
Run Code Online (Sandbox Code Playgroud)
我想得到价值10.我怎么做?
.net ×7
c# ×7
log4net ×2
wcf ×2
asynchronous ×1
exception ×1
kill ×1
logging ×1
nlog ×1
process ×1
stack-trace ×1
trace ×1
tracesource ×1