[英]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.