如何在旧版 .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 或任何其他)的处理程序。您可以传递它并在超时发生时中止操作
我有一些用 .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 或任何其他)的处理程序。您可以传递它并在超时发生时中止操作