1

在 .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调用异步发生,或者有一种更好、更可靠的方法来强制超时?

谢谢

4

1 回答 1

0

您是否考虑过简单地使用FtpWebRequest.TimeOut 属性

方向:

          FtpWebRequest request = null;

        request.Timeout = 3000;

        Func<WebResponse> responseDelegate = () => request.GetResponse();

        var asynchRes = responseDelegate.BeginInvoke(null, null);

        try
        {
            responseDelegate.EndInvoke(asynchRes);
        }
        catch (TimeoutException e)
        { 
            // bla
        }

想一想,也尝试指定 TimeOut 并调用 BeginGetResponse,它应该可以工作,因为它实际上在后台调用了 Synchronous 方法。

于 2012-07-24T17:22:56.627 回答