gpt4 book ai didi

c# - 不可等待为 "fire & forget"- 使用安全吗?

转载 作者:行者123 更新时间:2023-12-04 14:08:18 26 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

2年前关闭。




Improve this question




我们需要在代码中写一些日志。
日志是通过记录一些信息的网络请求写入的(记录器是一个 Http-API 模块),但是如果 API 中出现异常,我们不想中断整个流程。

我不使用Task.Run对于这种操作,因为它很糟糕。

但后来我想到了 non-awaitable-inline-function ,像这样:

private static readonly HttpClient client = new HttpClient();

void Main()
{

Console.WriteLine(1);
async Task LogMe()
{
var response = await client.PostAsync("http://www.NOTEXISTS.com/recepticle.aspx", null);
var responseString = await response.Content.ReadAsStringAsync();
//response.EnsureSuccessStatusCode(); // I don't need this here
Console.WriteLine("error");
}

//some code
LogMe();
//some code
Console.WriteLine(3);

}

输出:
1
2

问题:

在“即发即弃”模式下登录是一个可行的解决方案吗?
如果我在这个内联方法中创建对象,它们什么时候会被 GC 处理?

最佳答案

I don't to use Task.Run for this kind of operation, because it's bad.



识别/指定这种陈述的上下文很重要。 Task.Run在 ASP.NET 上很糟糕。在客户端的 GUI 应用程序中使用是完全可以的。

We need to write some logs in our code.



我强烈建议使用已建立的日志库。它们中的大多数通过使用由您的代码(同步)写入的内存队列来工作,并且由后台线程持续处理。这是一个已经确立的模式。

Is it a viable solution for logging in a "fire-and-forget" mode?



“一劳永逸”的问题之一是您不知道何时出现错误。已建立的日志库都有某种系统来处理与日志后端通信的错误;您发布的代码将忽略它们。

What if I create objects inside this inline method, when are they going to be GC'ed?



从概念上讲,只要异步方法将来继续执行,它们就充当 GC“根”。因此,当方法完成时,本地对象将被 GC'ed。

关于c# - 不可等待为 "fire & forget"- 使用安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59485524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com