我已将Microsoft Application Insights集成到我的Windows窗体应用程序中。在使用默认内存中通道的文档Application Insights on Windows Desktop apps, services and worker roles中,在刷新应用程序之后,在退出之前会休眠一秒钟。
tc.Flush(); // only for desktop apps
// Allow time for flushing:
System.Threading.Thread.Sleep(1000);
该文件指出:
请注意,Flush()对于持久性通道是同步的,但对于其他通道是异步的。
由于此示例使用的是内存中通道,我可以推断出代码示例中的刷新是异步的,因此是睡眠。
在我的代码中,我使用了持久性通道。在退出我的计划之前,我提出了一个事件应用程序关闭:
static void Main(string[] args)
{
try { /* application code */ }
finally
{
Telemetry.Instance.TrackEvent("Application Shutdown");
Telemetry.Instance.Flush();
System.Threading.Thread.Sleep(1000); // allow time for flushing
}
}
坚持文档,Flush
是同步的,因此在应用程序退出之前不需要睡眠。查看到达Azure门户的事件,我可以看到,对于大多数用户而言,应用程序关闭事件未到达云端。单步执行调试器并踩过Flush
我也感觉不到任何延迟。
我确定我使用了持久性通道,因为我可以在%LOCALAPPDATA%\Microsoft\ApplicationInsights
中看到数据被缓冲。
我的问题是:
Flush
clearly is synchronous,每个应用程序运行的最后一个事件在Azure中不会显示的问题是什么?答案 0 :(得分:4)
如果我没记错,Flush()会将剩余的遥测数据同步写入缓冲区(在持久通道的情况下为%LOCALAPPDATA%),但它不会启动任何传递操作。如果缓冲区位置没有改变,我希望这个遥测会在下一个应用程序启动后出现,因为AI将读取缓冲的数据并将其发送出去。 我可能会在这里弄错,这背后的逻辑可能会在不久前被改变..