About This Page
This page is part of the Azure documentation. It contains code examples and configuration instructions for working with Azure services.
Bias Analysis
Bias Types:
⚠️
windows_first
⚠️
missing_linux_example
⚠️
windows_tools
Summary:
The documentation exhibits a Windows bias by referencing Windows-specific tools (such as Fiddler), using Windows-centric debugging instructions (like 'Just My Code' and CLR exceptions in Visual Studio), and omitting Linux equivalents or instructions. There are no examples or troubleshooting steps tailored for Linux environments, containers, or cross-platform .NET development, and all code/configuration samples assume Windows/ASP.NET hosting patterns.
Recommendations:
- Add Linux-specific troubleshooting steps, such as using tcpdump, Wireshark, or curl for network diagnostics.
- Include instructions for viewing logs and debugging in Linux environments (e.g., using dotnet-trace, journalctl, or VS Code debugging).
- Mention and provide examples for cross-platform tools (e.g., Wireshark instead of only Fiddler, or browser DevTools for all OSes).
- Clarify that .NET Core and ASP.NET Core are cross-platform, and provide guidance for running and troubleshooting on Linux and in containers.
- When referencing configuration files (like web.config), note differences for Linux deployments (e.g., appsettings.json, environment variables).
- Balance the order of examples so that Linux or cross-platform approaches are presented alongside or before Windows-specific ones.
Create pull request
Flagged Code Snippets
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
<system.diagnostics>
<sources>
<source name="Microsoft.Azure.SignalR" switchName="SignalRSwitch">
<listeners>
<add name="ASRS" />
</listeners>
</source>
</sources>
<!-- Sets the trace verbosity level -->
<switches>
<add name="SignalRSwitch" value="Information" />
</switches>
<!-- Specifies the trace writer for output -->
<sharedListeners>
<add name="ASRS" type="System.Diagnostics.TextWriterTraceListener" initializeData="asrs.log.txt" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
public class ThreadPoolStarvationDetector : EventListener
{
private const int EventIdForThreadPoolWorkerThreadAdjustmentAdjustment = 55;
private const uint ReasonForStarvation = 6;
private readonly ILogger<ThreadPoolStarvationDetector> _logger;
public ThreadPoolStarvationDetector(ILogger<ThreadPoolStarvationDetector> logger)
{
_logger = logger;
}
protected override void OnEventSourceCreated(EventSource eventSource)
{
if (eventSource.Name == "Microsoft-Windows-DotNETRuntime")
{
EnableEvents(eventSource, EventLevel.Informational, EventKeywords.All);
}
}
protected override void OnEventWritten(EventWrittenEventArgs eventData)
{
// See: https://learn.microsoft.com/dotnet/framework/performance/thread-pool-etw-events#threadpoolworkerthreadadjustmentadjustment
if (eventData.EventId == EventIdForThreadPoolWorkerThreadAdjustmentAdjustment &&
eventData.Payload[2] as uint? == ReasonForStarvation)
{
_logger.LogWarning("Thread pool starvation detected!");
}
}
}