gpt4 book ai didi

timeout - 超时后是否需要调用 EndInvoke?

转载 作者:行者123 更新时间:2023-12-04 04:32:45 27 4
gpt4 key购买 nike

在网页上,我调用不允许我以编程方式设置超时的第三方。我调用 BeginInvoke 并使用 AsyncWaitHandle.WaitOne 等待指定的时间量。

如果调用超时,我会继续并忘记我开始的线程调用。我的问题是,在超时情况下我还需要以某种方式调用 EndInvoke 吗?这个 MSDN 页面上的“CAUTION”评论让我想知道我是否应该:http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.71).aspx

如果您认为我应该这样做,那么下一个问题是如果我的网页在第三方返回之前完成处理并返回到客户端,回调方法是否会在那里监听运行代码?一旦我的请求/响应完成,服务器是否不会停止寻找事件?

这是我正在使用的代码:

public class RemotePaymentProcessor
{
private delegate string SendProcessPaymentDelegate(string creditCardNumber);

private string SendProcessPayment(string creditCardNumber)
{
string response = string.Empty;
// call web service
SlowResponseService.SlowResponseService srs = new WebServiceTimeout.SlowResponseService.SlowResponseService();
response = srs.GetSlowResponse(creditCardNumber);
return response;
}

public string ProcessPayment(string creditCardNumber, int timeoutMilliseconds)
{
string response = string.Empty;

SendProcessPaymentDelegate sppd = new SendProcessPaymentDelegate(SendProcessPayment);
IAsyncResult ar = sppd.BeginInvoke(creditCardNumber, null, new object());
if (!ar.AsyncWaitHandle.WaitOne(timeoutMilliseconds, false))
{
// Async call did not return before timeout
response = "TIMEOUT";
}
else
{
// Async call has returned - get response
response = sppd.EndInvoke(ar);
}
return response;
}
}

最佳答案

如果不调用 EndInvoke,可能会泄漏一些资源(由 BeginInvoke 分配)。

所以为了完全安全,总是调用 EndInvoke() (这会阻塞,所以在你不需要的一些后台线程上这样做,或者切换到传递回调以免在等待时烧毁线程)。

在实践中,我不知道它的重要性(我认为许多 AsyncResults 不会泄漏,所以在这种情况下你可能会很幸运并且很安全)。

所有这些几乎与请求-响应和 Web 服务器无关,这就是 Begin/End 编程模型的工作原理,无论您在什么应用程序中使用它。

关于timeout - 超时后是否需要调用 EndInvoke?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/557918/

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