【发布时间】:2013-08-03 01:49:12
【问题描述】:
我正在开发一个连接尝试超时应该可配置的应用程序。
如果您看一下下面的代码,您会意识到我正在尝试这样做:等待 20 毫秒(此时已硬编码),如果可以建立连接,则调用 onConnected 回调操作真的;否则为 false(例如,如果发生超时)
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 语句包装调用,但它可以有多个调用者,并且在每个调用者看起来都错误时这样做。
我怎样才能实现我想要的?
【问题讨论】:
标签: c# exception .net-4.0 task-parallel-library