gpt4 book ai didi

c# - 使用 TPL FromAsync 实现套接字超时的异常处理

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:36 25 4
gpt4 key购买 nike

我正在开发一个连接尝试超时应该是可配置的应用程序。

如果您看一下下面的代码,您会意识到我正在尝试做的事情:WAITING 20 毫秒(目前已硬编码),如果可以建立连接,则调用 onConnected 回调操作真的;否则为假(例如,如果超时发生)

internal void Connect(Action<bool> onConnected)
{
Func<AsyncCallback, object, IAsyncResult> beginConnect =
(callback, s) =>
{
var asyncResult = _socket.BeginConnect(Endpoint, callback, s);
var success = asyncResult.AsyncWaitHandle.WaitOne(20, true);
if(!success) throw new TimeoutException("Connection timeout");
return asyncResult;
};

var task = Task.Factory.FromAsync(beginConnect, _socket.EndConnect, this);
task.ContinueWith(t => onConnected(true), TaskContinuationOptions.NotOnFaulted)
.ContinueWith(t => onConnected(false), TaskContinuationOptions.OnlyOnFaulted);
task.ContinueWith(t => onConnected(false), TaskContinuationOptions.OnlyOnFaulted);
}

问题是由于 beginConnect 函数中的超时异常,回调从未被调用。我想我可以在 Connect 方法调用者中用 tyr-catch 语句包装调用,但它可以有多个调用者并且在每个调用者中这样做看起来都是错误的。

我怎样才能实现我想要的目标?

最佳答案

我找到了一种方法来实现我正在寻找的东西:

internal void Connect(Action<bool> onConnected)
{
Func<AsyncCallback, object, IAsyncResult> beginConnect =
(callback, s) =>
{
var asyncResult = _socket.BeginConnect(Endpoint, callback, s);
var success = asyncResult.AsyncWaitHandle.WaitOne(20, true);
if(!success)
{
onConnected(false);
return default(IAsyncResult);
}
return asyncResult;
};

var task = Task.Factory.FromAsync(beginConnect, _socket.EndConnect, this);
task.ContinueWith(t => onConnected(true), TaskContinuationOptions.NotOnFaulted)
.ContinueWith(t => onConnected(false), TaskContinuationOptions.OnlyOnFaulted);
task.ContinueWith(t => onConnected(false), TaskContinuationOptions.OnlyOnFaulted);
}

关键是在 20 毫秒后,如果还没有连接,它会调用带有 false 的回调并返回默认的 IAsyncResult。

关于c# - 使用 TPL FromAsync 实现套接字超时的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18021457/

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