簡體   English   中英

C# Singleton - 使用異步等待觸發並忘記

[英]C# Singleton - Fire and forget with Async await

上下文 - 我正在使用 Azure CosmosDB GraphAPI - 而 azure 沒有日志記錄,可悲! 所以我們想出了使用我們自己的查詢記錄及其元屬性

我實現了一個 Singleton class 被其他服務用於 DB 調用,我想着火並忘記對記錄器的調用。

    public class GraphDatabaseQuery : IGraphDatabaseQuery
    {
        private readonly GremlinClient gremlinClient;
        public GraphDatabaseQuery()
        {
            if (gremlinClient == null)
            {
                gremlinClient = CosmosDbClient.Instance;
            }
            else
            {
                if (gremlinClient.NrConnections == 0)
                {
                    gremlinClient = CosmosDbClient.Instance;
                }
            }
        }

        public async Task<ResultSet<dynamic>> SubmitQueryAsync(string query, string fullName)
        {
            var response = await gremlinClient.SubmitAsync<dynamic>(query);
            _ = SendQueryAnalytics(response, query, fullName);
            return response;
        }
        public async Task<dynamic> SubmitQueryWithSingleSingleResultAsync(string query, string fullName)
        {
            var response = await gremlinClient.SubmitWithSingleResultAsync<dynamic>(query);
            return response;

        }

        private async Task<bool> SendQueryAnalytics(ResultSet<dynamic> response, string query, string fullName)
        {
            try
            {
                await new QueryAnalytics().pushData(response, query, fullName); // breakpoint here 
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return true;
        }
    }

在啟動.cs

            services.AddSingleton<IGraphDatabaseQuery, GraphDatabaseQuery>();

和界面

    public interface IGraphDatabaseQuery
    {
        public Task<ResultSet<dynamic>> SubmitQueryAsync(string query, string fullName);
        public Task<dynamic> SubmitQueryWithSingleSingleResultAsync(string query, string fullName);

    }

每當我測試它時,斷點就會命中“SendQueryAnalytics”,但我假設那時來自調用 function 的響應將被發回

這是因為我使用的是 singleton 模式而不起作用嗎?

每當我測試它時,斷點就會命中“SendQueryAnalytics”,但我假設那時來自調用 function 的響應將被發回

不,所有異步方法都開始同步執行

所以發生的事情是SendQueryAnalytics被調用並開始執行,進入try塊,創建一個新的QueryAnalytics實例,並調用pushData pushData也開始執行並且(可能)返回一個不完整的Task 然后SendQueryAnalytics中的await觀察到該Task不完整,並向 SubmitQueryAsync 返回一個不完整的TaskSubmitQueryAsync丟棄該Task實例,然后返回響應。

因此,在該斷點之后看到返回的響應是正常的。

我不認為 singleton 模式與它有關。 既然您想要“一勞永逸”,為什么不使用類似hangfire的東西?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM