繁体   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