我们今天正在使用Application Insights来跟踪WPF解决方案中的事件。
由于这是一个桌面,我们需要手动调用flush方法。
由于我们没有跟踪一堆事件,所以每当事件发生时我们都会一直在冲洗。
我们意识到冲洗方法非常慢。我们现在所做的是将此刷新调用移动到另一个线程,因此需要保留很多锁和检查,额外的代码。
查看应用程序洞察代码,可以归结为这两种方法:
private void DequeueAndSend()
{
lock (this.sendingLockObj)
{
IEnumerable<ITelemetry> telemetryItems = this.buffer.Dequeue();
try
{
// send request
this.Send(telemetryItems).ConfigureAwait(false).GetAwaiter().GetResult();
}
catch (Exception e)
{
CoreEventSource.Log.LogVerbose("DequeueAndSend: Failed Sending: Exception: " + e.ToString());
}
}
}
/// <summary>
/// Serializes a list of telemetry items and sends them.
/// </summary>
private async Task Send(IEnumerable<ITelemetry> telemetryItems)
{
if (telemetryItems == null || !telemetryItems.Any())
{
CoreEventSource.Log.LogVerbose("No Telemetry Items passed to Enqueue");
return;
}
byte[] data = JsonSerializer.Serialize(telemetryItems);
var transmission = new Transmission(this.endpointAddress, data, "application/x-json-stream", JsonSerializer.CompressionType);
await transmission.SendAsync().ConfigureAwait(false);
}
具体看这一行:
this.Send(telemetryItems).ConfigureAwait(false).GetAwaiter().GetResult();
不确定我是否正确,但GetResult()不会使此方法同步,如果是这样,为什么以这种方式实现?
如果没有,Flush()方法的原因可能是如此之慢?