【问题标题】:C# Singleton - Fire and forget with Async awaitC# Singleton - 使用异步等待触发并忘记
【发布时间】:2021-04-20 22:07:45
【问题描述】:

上下文 - 我正在使用 Azure CosmosDB GraphAPI - 天蓝色没有日志记录,可悲! 所以我们想出了使用我们自己的查询日志记录及其元属性

我实现了一个 Singleton 类,它被其他服务用于 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;
        }
    }

在startup.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”,但我假设那时调用函数的响应会被发回

这是因为我使用的是单例模式而不起作用吗?

【问题讨论】:

  • 使用Task.Run

标签: c# .net-core async-await


【解决方案1】:

每当我测试它时,断点就会命中“SendQueryAnalytics”,但我假设那时调用函数的响应会被发回

没有。 All asynchronous methods begin executing synchronously.

所以发生的情况是SendQueryAnalytics 被调用并开始执行,进入try 块,创建一个新的QueryAnalytics 实例,并调用pushDatapushData 也开始执行并且(可能)返回一个不完整的Task。然后SendQueryAnalytics 中的await 观察到Task 不完整,并将不完整的Task 返回到SubmitQueryAsync,它丢弃了Task 实例并然后 返回响应。

因此,看到那个断点之后返回的响应是正常的。

【讨论】:

    【解决方案2】:

    我认为单例模式与它无关。既然你想要“一劳永逸”,为什么不使用hangfire 之类的东西?

    【讨论】:

      猜你喜欢
      • 2020-04-25
      • 2014-12-06
      • 2010-09-14
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 2018-07-27
      相关资源
      最近更新 更多