标签: system.diagnostics


"优雅地"杀死一个进程

现在我正在使用Process.Kill()来杀死进程.有没有办法,而不是立即杀死它,我可以向进程发送一条消息,指示它关闭,以便它可以优雅地清理和关闭.基本上,我正在寻找仅仅点击右上角的红色X的等价物,我相信它会向请求关闭的应用程序发送消息.

.net c# system.diagnostics kill process

24
推荐指数
2
解决办法
1万
查看次数

我怎么知道最后一次OutputDataReceived何时到达?

我在针对.Net framework 3.5的程序中有一个System.Diagnostics.Process对象

我已经重定向了两个StandardOutputStandardError管道,我正在异步地从它们接收数据.我还为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)

c# asynchronous system.diagnostics

21
推荐指数
1
解决办法
7795
查看次数

使用log4net或NLog进行WCF日志记录/跟踪和活动ID传播

我在日志记录中看到了许多其他问题.最佳做法.什么日志记录平台最好.等等.这里有一些关于SO的链接以及关于该主题的非常好的讨论:

记录最佳实践

log4net vs TraceSource

.NET 3.5项目的最佳日志记录解决方案

.NET3.5日志记录

开始编辑:

键入这篇长篇文章后,我想我想弄清楚的主要是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)

wcf logging log4net system.diagnostics nlog

21
推荐指数
1
解决办法
1万
查看次数

我的流程在等待输入吗?

我正在使用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 c# system.diagnostics

18
推荐指数
1
解决办法
9741
查看次数

System.Diagnostics.Debug命名空间与其他日志记录解决方案(log4net,MS Enterprise Library等)

我正在调查.net项目的各种日志记录可能性,我无法在System.Diagnostics.Debug/Trace功能和第三方库(如log4net,MS Enterprise Library,NLog等)之间做出决定.
目前我已经发现了这个:

  • System.Diagnostics相当难以配置和使用,因为您需要显式配置所有侦听器,过滤器,源等.它似乎也缺少对DB的批量插入(考虑每个都写入100'000个日志条目它自己的插入,恐怖,不是吗?).但是对于某些人而言,不使用额外的库来进行像Logging这样的"基本"事情被认为是"酷"(当然,在某些时候,减少项目所依赖的第三方库的数量是有意义的,但这次不是,我想)
  • 第三方功能更强大,通常更快,更容易使用,但配置有时也会很痛苦,而且这些库通常不太可靠(比如EntLib的神秘突然停止记录等)
  • Common.Logging怎么样?是否值得尝试(因为,正如我所听到的,它提供了插入各种日志框架,并充当应用程序和所需的lib之间的接口)?


如果有人能指出我正确的方向或纠正(或添加一些东西)给我上面给出的比较,我将非常感激!也许如果你鼓励我使用第三方,你可以建议一些特定的一方(考虑到我们的应用程序很可能不需要任何花哨的东西,如UDP,滚动文件等 - 只是普通文件,电子邮件,数据库和事件簿)?
提前致谢!

.net log4net enterprise-library system.diagnostics

18
推荐指数
1
解决办法
5407
查看次数

System.Diagnostics.TraceSource中的跟踪输出格式

以下代码:

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文档也没有透露任何有用的信息.

.net c# system.diagnostics tracesource

18
推荐指数
2
解决办法
1万
查看次数

跟踪日志位置,查看位置

Trace.Write("");开发MVC或WCF应用程序时,您在哪里看到日志?什么是正确的地方?

c# wcf trace system.diagnostics

18
推荐指数
1
解决办法
2万
查看次数

.net Diagnostics最佳实践?

我们最初没有使用任何日志记录或调试跟踪,但在花了几周时间追踪一些数据损坏后,我们决定将生成所需的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中还有其他有用的东西吗?

.net system.diagnostics

16
推荐指数
2
解决办法
6190
查看次数

如何在stacktrace中获取参数值

我可以通过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 c# system.diagnostics exception stack-trace

15
推荐指数
1
解决办法
1万
查看次数