gpt4 book ai didi

c# - 垃圾收集器是否会在 .NET 中的异步调用期间销毁临时未引用的对象?

转载 作者:太空狗 更新时间:2023-10-29 17:41:13 25 4
gpt4 key购买 nike

假设我将在 .NET 中进行异步调用,即 HttpWebRequest.BeginGetResponse,并且没有在更广泛的范围内引用 HttpWebRequest 对象。垃圾收集器会破坏它并导致问题吗?

示例代码:

using System;
using System.Net;

public class AsyncHttpWebRequest
{
void Main()
{
var Request = HttpWebRequest.Create("http://www.contoso.com");
var result = Request.BeginGetResponse(GetResponseCallback, null);
}

private void GetResponseCallback(IAsyncResult AsyncResult)
{
// Do Something..
}
}

替代版本(请求作为 AsyncState 传递):

using System;
using System.Net;

public class AsyncHttpWebRequest
{
void Main()
{
var Request = HttpWebRequest.Create("http://www.contoso.com");
var result = Request.BeginGetResponse(GetResponseCallback, Request);
}

private void GetResponseCallback(IAsyncResult AsyncResult)
{
// Do Something..
}
}

最佳答案

如果任何事件线程包含对它的引用,或者如果它被静态引用(在这两种情况下都是直接或间接引用),则该对象被认为是事件的并且不符合垃圾回收条件。

在这两个示例中,异步 API 都会保留对您的请求的引用(在异步 IO 操作所在的线程池中),因此在它完成之前不会被垃圾回收。

关于c# - 垃圾收集器是否会在 .NET 中的异步调用期间销毁临时未引用的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/421547/

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