原始的方法调用方式如下:
public string AskAPI(string uri)
{
return api.Query(uri);
}
API只是一个导入的dll引用。
现在,我想给AskAPI方法添加超时功能,如果api.Query花费的时间超过30秒,AskAPI将抛出异常。
似乎我无法让它工作。有人能分享一下他们的想法吗?
谢谢!
原始的方法调用方式如下:
public string AskAPI(string uri)
{
return api.Query(uri);
}
API只是一个导入的dll引用。
现在,我想给AskAPI方法添加超时功能,如果api.Query花费的时间超过30秒,AskAPI将抛出异常。
似乎我无法让它工作。有人能分享一下他们的想法吗?
谢谢!
public string AskAPI(string uri, int millis)
{
using (var task = new Task<string>(() => api.Query(uri)))
{
task.Start();
task.Wait(millis);
if (!task.IsCompleted) throw new TimeoutException();
return task.Result;
}
}
public T Await<T>(Func<T> fun, int millis)
{
using (var cancel = new CancellationTokenSource(millis))
using (var task = new Task<T>(() =>
{
T result = default(T);
var thread = new Thread(() => result = fun());
thread.Start();
while (!cancel.Token.IsCancellationRequested && thread.IsAlive) ; // Wait for a sign from above
thread.Abort();
cancel.Token.ThrowIfCancellationRequested();
return result;
}, cancel.Token))
{
task.Start();
task.Wait(millis);
cancel.Cancel();
if (!task.IsCompleted) throw new TimeoutException();
return task.Result;
}
}
然后使用以下方式调用:
Await(() => AskAPI("http://some.uri"), 30000);
api.Query
没有被中止? - Jim Mischel
api.Query
来添加超时功能。由于你没有提供任何关于它的信息,所以无法告诉你如何做到这一点。(在你发布的内容中,没有办法在调用周围设置超时,因为你没有办法基于它来中断它。) - Ken White{}
不算在内),没有任何其他背景信息。根据你所提供的信息,答案是“不行”。 - Ken White