缓慢冲洗(发送)事件

时间:2016-03-08 09:35:42

标签: wpf asynchronous async-await azure-application-insights

我们今天正在使用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()方法的原因可能是如此之慢?

0 个答案:

没有答案