如何在旧版 .net 3.5 上调用超时函数

how to call function with timeout on legacy .net 3.5

我有一些用 .net 3.5 编写的遗留代码

我需要添加一些能力来调用某些方法(io 方法)并超时 => 这意味着在 X 秒后如果它没有完成我需要抛出异常。

无法使用 Task,因为在 .net 3.5 上没有 Task。
怎么做 ?

您可以创建一个与您的方法具有相同签名的委托,然后使用 BeginInvoke 调用它并使用 WaitOne() 方法阻塞当前线程并超时。如果超时后操作仍未完成,则会抛出异常

public delegate void AsyncMethodCaller(...);

AsyncMethodCaller caller = new AsyncMethodCaller();

IAsyncResult result = caller.BeginInvoke(...);

result.AsyncWaitHandle.WaitOne(timeout);

if(!result.IsCompleted)
{
    //throw an exception
}

模式详细示例见MSDN. And keep in mind, that this code blocks the current thread. If you need an asynchronous wait, there is a different approach, using RegisterWaitForSingleObject method from ThreadPool class

ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle,
        (state, timeout) =>
        {
            if (timeout)
            {
                 //do something
            }
        },
        state, timeout, true);
在这种情况下,

state 变量是您的操作(IO 或任何其他)的处理程序。您可以传递它并在超时发生时中止操作