在此链接上:https://azure.microsoft.com/en-us/documentation/articles/app-insights-api-custom-events-metrics/
它明确地说:
TelemetryClient是线程安全的。
我们建议您为应用的每个模块使用TelemetryClient实例。
但是,MSDN文档(https://msdn.microsoft.com/en-us/library/azure/microsoft.applicationinsights.telemetryclient.aspx)说:
此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。
所以问题是,TrackEvent和TrackMetric等大多数函数都不是静态的。如果我按照第一篇文章,为我的Web服务设置单例实例,我会遇到线程问题吗?
答案 0 :(得分:9)
TelemetryClient是线程安全的。有效的用法是创建单例并重用它。您不会遇到重用实例的问题。
答案 1 :(得分:4)
当MSDN Docs说给定的类不是线程安全的时,通常是不正确的。我不确定人们如何标记他们的代码才能使这些文档反映出类的线程安全性,但是我已经看到很多实例,这些文档不正确。
the Azure article you linked当前版本说:
TelemetryClient是线程安全的。
对于ASP.NET和Java项目,将自动捕获传入的HTTP请求。您可能想为应用程序的其他模块创建TelemetryClient的其他实例。例如,您可能在中间件类中有一个TelemetryClient实例来报告业务逻辑事件。您可以设置诸如UserId和DeviceId之类的属性来标识计算机。此信息将附加到实例发送的所有事件。
TelemetryClient.Context.User.Id = "..."; TelemetryClient.Context.Device.Id = "...";
最后一点非常重要。即使该类是线程安全的,但是如果您编写的Web应用程序中的UserId可能会发生变化,则您可能应该为这些值都相同的每个范围重用遥测客户端的实例(例如每个Request) ),但不能作为静态/单个实例。
在ASP.NET Core中,Application Insights大量使用依赖项注入并将TelemetryClient注册为单例!
这意味着您应该避免在客户端上下文中设置不想在整个应用程序中使用的变量,而应利用遥测初始化程序在每个遥测对象上设置诸如用户ID之类的内容