标签: system.diagnostics

CorrelationManager.LogicalOperationStack是否与Parallel.For,Tasks,Threads等兼容

有关背景信息,请参阅此问题:

任务并行库中的任务如何影响ActivityID?

该问题询问Tasks如何影响Trace.CorrelationManager.ActivityId.@Greg Samson用测试程序回答了他自己的问题,显示ActivityId在Tasks的上下文中是可靠的.测试程序在Task委托的开头设置一个ActivityId,休眠以模拟工作,然后检查最后的ActivityId以确保它是相同的值(即它没有被另一个线程修改).该程序成功运行.

在研究线程,任务和并行操作的其他"上下文"选项(最终为日志提供更好的上下文)时,我遇到了Trace.CorrelationManager.LogicalOperationStack的一个奇怪问题(无论如何我都很奇怪).我在下面的问题中复制了我的"答案".

我认为它充分描述了我遇到的问题(Trace.CorrelationManager.LogicalOperationStack显然已经损坏 - 或者什么 - 当在Parallel.For的上下文中使用时,但只有当Parallel.For本身包含在逻辑操作中时) .

这是我的问题:

  1. Trace.CorrelationManager.LogicalOperationStack应该可以与Parallel.For一起使用吗?如果是这样,如果一个逻辑操作已经与Parallel.For启动有效,它是否会有所不同?

  2. 是否有一种"正确"的方式使用LogicalOperationStack与Parallel.For?我能不同地对这个示例程序进行编码以使其"有效"吗?通过"工作",我的意思是LogicalOperationStack总是具有预期的条目数,并且条目本身是预期的条目.

我已经使用Threads和ThreadPool线程做了一些额外的测试,但是我必须返回并重试这些测试,看看我是否遇到了类似的问题.

我会说,看起来任务/并行线程和ThreadPool线程确实从父线程"继承"了Trace.CorrelationManager.ActivityId和Trace.CorrelationManager.LogicalOperationStack值.这是预期的,因为CorrelationManager使用CallContext的LogicalSetData方法(而不是SetData)存储这些值.

请再次参考此问题,以获取我在下面发布的"答案"的原始背景:

任务并行库中的任务如何影响ActivityID?

另请参阅Microsoft的Parallel Extensions论坛上的类似问题(目前尚未得到解答):

http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/7c5c3051-133b-4814-9db0-fc0039b4f9d9

[开始粘贴]

请原谅我发布这个作为答案,因为它不是你的问题的真正答案,但是,它与你的问题有关,因为它处理CorrelationManager行为和线程/任务/等.我一直在寻找使用CorrelationManager LogicalOperationStack(和StartLogicalOperation/StopLogicalOperation方法)在多线程场景中提供额外的上下文.

我拿了你的例子并稍微修改它以增加使用Parallel.For并行执行工作的能力.另外,我用StartLogicalOperation/StopLogicalOperation括号(内部)DoLongRunningWork.从概念上讲,DoLongRunningWork每次执行时都会执行以下操作:

DoLongRunningWork
  StartLogicalOperation
  Thread.Sleep(3000)
  StopLogicalOperation
Run Code Online (Sandbox Code Playgroud)

我发现如果我将这些逻辑操作添加到您的代码中(或多或少),所有逻辑操作都保持同步(始终是堆栈上预期的操作数,并且堆栈上的操作值始终为预期).

在我自己的一些测试中,我发现并非总是这样.逻辑操作堆栈正在"损坏".我能想到的最好的解释是,当"子"线程退出时,将CallContext信息"合并"回"父"线程上下文导致"旧"子线程上下文信息(逻辑操作)为"继承"由另一个兄弟姐妹线程.

问题也可能与Parallel.For显然使用主线程(至少在示例代码中,如编写)作为"工作线程"之一(或者在并行域中应该调用它们)之间的事实有关.每当执行DoLongRunningWork时,就会启动一个新的逻辑操作(在开始时)并停止(在结束时)(也就是说,将其推送到LogicalOperationStack并从中弹出).如果主线程已经有效的逻辑操作,并且DoLongRunningWork在主线程上执行,则启动新的逻辑操作,因此主线程的LogicalOperationStack现在具有两个操作.DoLongRunningWork的任何后续执行(只要DoLongRunningWork的这个"迭代"在主线程上执行)将(显然)继承主线程的LogicalOperationStack(现在它有两个操作,而不仅仅是一个预期的操作).

我花了很长时间才弄清楚为什么LogicalOperationStack的行为在我的示例中与我的示例的修改版本不同.最后我看到在我的代码中我将整个程序放在逻辑操作中,而在我的测试程序的修改版本中,我没有.这意味着在我的测试程序中,每次执行"工作"(类似于DoLongRunningWork)时,已经存在逻辑操作.在我的测试程序的修改版本中,我没有在逻辑操作中将整个程序括起来.

所以,当我修改你的测试程序以在逻辑操作中包含整个程序时如果我使用Parallel.For,我遇到了完全相同的问题.

使用上面的概念模型,这将成功运行:

Parallel.For
  DoLongRunningWork
    StartLogicalOperation
    Sleep(3000)
    StopLogicalOperation
Run Code Online (Sandbox Code Playgroud)

虽然这最终会因为LogicalOperationStack显然不同步而断言:

StartLogicalOperation
Parallel.For
  DoLongRunningWork
    StartLogicalOperation
    Sleep(3000)
    StopLogicalOperation
StopLogicalOperation
Run Code Online (Sandbox Code Playgroud)

这是我的示例程序.它类似于你的,因为它有一个DoLongRunningWork方法来操作ActivityId以及LogicalOperationStack.我也有两种踢DoLongRunningWork的方式.一种风味使用任务一使用Parallel.For.还可以执行每种风格,使得整个并行操作被包含在逻辑操作中或不包含在逻辑操作中.因此,总共有4种方法来执行并行操作.要尝试每个,只需取消注释所需的"使用..."方法,重新编译并运行. UseTasks,UseTasks(true)并且UseParallelFor应该全部运行完成. UseParallelFor(true)因为LogicalOperationStack没有预期的条目数,所以会在某些时候断言.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; …
Run Code Online (Sandbox Code Playgroud)

.net c# system.diagnostics parallel-extensions task-parallel-library

10
推荐指数
1
解决办法
4110
查看次数

从System.Diagnostics.Process调用dism.exe失败

为了在Windows 2008 R2 Server(64位)中启用Microsoft-Hyper-V和Microsoft-Hyper-V-Management,我将dism.exe作为进程调用.我用过的命令是

Dism.exe/online/Get-FeatureInfo/FeatureName:Microsoft-Hyper-V

Dism.exe/online/Get-FeatureInfo/FeatureName:Microsoft-Hyper-V-Management-Clients

当我从命令行执行此操作时,这可以正常工作,但当我尝试通过我的代码执行它时,它会失败.我在C:\ Windows\SysWoW64文件夹下尝试过64位版本的Dism.exe,但它也失败了.这是我收到的错误消息,

您无法使用32位版本的DISM为正在运行的64位操作系统提供服务.请使用与您的计算机体系结构相对应的DISM版本.

我在这里错过了什么?

更新:SLaks是对的,但问题是默认情况下MS Visual Studio express版本的目标是x86,我必须在.csproj文件中手动编辑到AnyCPU以使其工作.

c# system.diagnostics visual-studio windows-server-2008-r2

10
推荐指数
2
解决办法
8695
查看次数

自动将System.diagnostics.trace消息记录到Nlog目标

假设您在整个应用程序中都有C#跟踪消息.就像是:

Trace.TraceInformation("Service Started"); 
Run Code Online (Sandbox Code Playgroud)

如何自动将此日志记录到nLog目标,而无需向具有跟踪消息的所有类添加如下代码?

using NLog;
private static Logger logger = LogManager.GetCurrentClassLogger();
Run Code Online (Sandbox Code Playgroud)

有没有办法在不包含.NET Framework本身生成的跟踪的情况下执行此操作,本文将演示如何执行操作?

c# trace system.diagnostics nlog

10
推荐指数
2
解决办法
8600
查看次数

我应该在TraceSource.TraceEvent方法中使用id参数识别什么?

我使用TraceSource类来登录我的.NET项目.

然而,我从未清楚过的一点是,idTraceEvent方法中参数的意图是什么.目前,我总是把它设置为0.

但它的预期或典型有用用途是什么?

我可以想到几个可能性:

  • 它是事件发生的ID(即同一行代码在每次执行时产生不同的ID);
  • 它是方法调用的ID(即您可以从ID中推断出代码行);
  • 它是一系列类似事件的ID(例如,表示数据库不存在的所有错误消息共享相同的ID);
  • 它是与逻辑操作相关的一组事件的ID,与TraceEventType.(Start|Stop|Suspend|Resume|Transfer)枚举值结合使用;

.net c# system.diagnostics

10
推荐指数
1
解决办法
2371
查看次数

Application Insights TraceListener不收集跟踪?

我有以下配置,但没有跟踪到Application Insights(否则Application Insights可以正常用于其他日志记录,Azure诊断侦听器也在工作并捕获跟踪).难道我做错了什么?

<system.diagnostics>
    <trace autoflush="true" indentsize="0">
      <listeners>
        <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics">
        </add>
        <add name="myAppInsightsListener" type="Microsoft.ApplicationInsights.TraceListener.ApplicationInsightsTraceListener, Microsoft.ApplicationInsights.TraceListener" />
      </listeners>
    </trace>
  </system.diagnostics>
Run Code Online (Sandbox Code Playgroud)

system.diagnostics azure azure-diagnostics azure-application-insights

10
推荐指数
1
解决办法
4479
查看次数

使用凭据的.NET进程启动进程错误(句柄无效)

我有一个Windows窗体应用程序,它为StartInfo提供用户名,域和密码,它会抛出:

System.ComponentModel.Win32Exception:句柄 在System.Diagnostics.Process.Start()的System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)中无效

当我允许凭证默认为当前用户时,我没有得到这样的错误,并且我开始的过程工作到不需要使用凭证的程度(在MSBuild脚本中映射驱动器所需的信用).这是填充开始信息的代码:

Process p = new Process();
ProcessStartInfo si = new ProcessStartInfo(buildApp, buildArgs);
si.WorkingDirectory = msBuildWorkingDir;
si.UserName = txtUserName.Text;
char[] psw = txtPassword.Text.ToCharArray();
SecureString ss = new SecureString();
for (int x = 0; x < psw.Length; x++)
{
    ss.AppendChar(psw[x]);
}
si.Password = ss;
si.Domain = "ABC";
si.RedirectStandardOutput = true;
si.UseShellExecute = false;
si.WorkingDirectory = txtWorkingDir.Text;
p.StartInfo = si;
p.Start();
Run Code Online (Sandbox Code Playgroud)

并不是用户/ psw不匹配,因为当我提供一个糟糕的psw时,它会抓住它.因此,这个"无效句柄"的事情在信用证通过后发生.关于我可能会忽略或搞砸的任何想法?

.net c# system.diagnostics

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

在我的C#Win应用程序中打开Windows计算器?

我知道我可以使用以下代码打开Windows Calculator:

System.Diagnostics.Process.Start("calc");
Run Code Online (Sandbox Code Playgroud)

但是我想在我的C#Win应用程序中打开它,即:我不想在独立窗口中打开它,我想在我的窗口中打开它.
我该怎么做 ?

.net c# system.diagnostics calculator windows-7

9
推荐指数
3
解决办法
3万
查看次数

如何为 HttpClient 调用配置网络跟踪 Dotnet 核心?

根据https://docs.microsoft.com/en-us/dotnet/framework/network-programming/how-to-configure-network-tracing 上的参考文件

我们可以在 web.config 或任何其他配置文件中设置它,我们可以获得详细的 system.net 跟踪、HttpClient调用的数据包跟踪以及调用中的任何类型的问题HttpClient都可以在跟踪中捕获,无论是证书、TLS 还是其他任何东西。

但是,我们是否有类似的 dotnet 核心/标准实现,可以在 web 应用程序或控制台应用程序/库中使用?

dotnet 框架的配置:

<configuration>  
  <system.diagnostics>  
    <sources>  
      <source name="System.Net" tracemode="includehex" maxdatasize="1024">  
        <listeners>  
          <add name="System.Net"/>  
        </listeners>  
      </source>  
      --------------
----------------------
Run Code Online (Sandbox Code Playgroud)

c# system.diagnostics dotnet-httpclient .net-core .net-standard

9
推荐指数
2
解决办法
5111
查看次数

如何在全球范围内跟踪 .net core 2.1 中的所有 HTTP 请求?

我想在 dotnet core 2.1 应用程序中记录所有 HTTP 请求。日志记录应包括 HTTP 标头、正文和主机地址。我需要在不更改现有代码的情况下全局绑定我的日志记录代码。

我试过这个例子https://www.azurefromthetrenches.com/capturing-and-tracing-all-http-requests-in-c-and-net/,但没有 HTTP 事件来到监听器。

有没有办法在全球范围内侦听 dotnet core 2.1 上的 HTTP 事件?

c# system.diagnostics dotnet-httpclient .net-core

9
推荐指数
2
解决办法
8210
查看次数

How to get the current TraceId and SpanId

This article, https://devblogs.microsoft.com/aspnet/improvements-in-net-core-3-0-for-troubleshooting-and-monitoring-distributed-apps/, tells me that the field TraceId is available as a correlation id, which is great!

info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
     => ConnectionId:0HLR1BR0PL1CH 
     => RequestPath:/weatherforecastproxy 
        RequestId:0HLR1BR0PL1CH:00000001, 
        SpanId:|363a800a-4cf070ad93fe3bd8., 
        TraceId:363a800a-4cf070ad93fe3bd8, 
        ParentId: Executed endpoint 'FrontEndApp.Controllers.WeatherForecastProxyController.Get
(FrontEndApp)'
Run Code Online (Sandbox Code Playgroud)

In fact, I can see that in our log sink this works as advertised: When web application A serves a request and in doing so invokes web application B, both of them write the same TraceId value to the log.

As far as I understand, any ASP.NET …

system.diagnostics .net-core asp.net-core

9
推荐指数
1
解决办法
6682
查看次数