【发布时间】:2021-04-09 10:07:45
【问题描述】:
我需要定期向网站发送 GET 请求。
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
HttpClient httpClient = new HttpClient();
Uri requestUri = new Uri("https://pastebin.com/raw/1j9EAVUW");
while (true)
{
await httpClient.GetAsync(requestUri);
await Task.Delay(1000);
}
}
但是,运行此代码会导致内存泄漏,并且 RAM 使用量每秒都会增加。
应用 using 无济于事,在循环内初始化 HttpClient 也无济于事。
我想出的唯一解决方案是手动调用GC.Collect() 每次循环执行,或每~10 次执行。但我读过这被认为是一种不好的做法。
还有其他方法吗?
HttpClient 文档:https://docs.microsoft.com/en-us/uwp/api/windows.web.http.httpclient?view=winrt-19041
【问题讨论】:
-
如果
GC.Collect()回收内存,那么显然没有内存泄漏。您选择了非确定性垃圾收集方案,这就是您所得到的。如果您需要一个具有可预测性能特征的系统,您将不得不使用一种支持确定性垃圾收集的编程语言,例如 C++。 -
你是对的。我误用了“内存泄漏”一词。这只是 C# 的本质。我已经用 C++ 重写了代码,它工作得非常好,因为响应对象在超出范围时会自动销毁(一个循环执行)
标签: c# .net windows uwp memory-leaks