在 .NET 4.0 中,我使用的是FtpWebRequest
异步方法。
我遇到的一个问题是我想要一个超时选项。
为了实现这一点,我目前ManualResetEvent
在异步状态下传递 a ,然后ResetEvent.WaitOne(30000)
在启动请求后调用,确保布尔响应为真(或抛出 a TimeoutException
)。
如果我的异步方法异步运行,我相信这很好,因为它们在另一个线程中启动,我当前的线程继续执行WaitOne
,然后异步方法完成或超时触发。
像这样的东西:
var ar = state.Request.BeginGetResponse(
new AsyncCallback(BeginGetResponseCallback),
state // has a ManualResetEvent
);
// Won't reach here if BeginGetResponse run synchronously
// as indicated by ar.CompletedSynchronously.
// The risk is then that BeginGet blocks infinitely
// without a timeout (as I'm seeing)
if (!state.ResetEvent.WaitOne((int)5000))
throw new TimeoutException();
但是,如果我的异步方法同步运行(如 所示CompletedSynchronously
),WaitOne
则永远不会到达,并且线程会无限阻塞。
有没有一种可靠的方法(也许是BackgroundWorker
?)来确保Begin/End
调用异步发生,或者有一种更好、更可靠的方法来强制超时?
谢谢