[英]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 返回一个不完整的Task
, SubmitQueryAsync
丢弃该Task
实例,然后返回响应。
因此,在该断点之后看到返回的响应是正常的。
我不认为 singleton 模式与它有关。 既然您想要“一劳永逸”,为什么不使用类似hangfire的东西?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.