C# 如何从操作返回值
我有一个代理测试功能。在它里面我有一个catch块,在指定的时间量(超时)之后,如果代理不好,我返回一个false标志。问题是,即使没有异常存在,函数每10次挂起一次。实际上,HttpWebResponse.Timeout不能正常工作(或者它可以正常工作,但我不知道如何使用它)。所以一位So用户给了我这个解决方案:C# 如何从操作返回值,c#,.net,delegates,C#,.net,Delegates,我有一个代理测试功能。在它里面我有一个catch块,在指定的时间量(超时)之后,如果代理不好,我返回一个false标志。问题是,即使没有异常存在,函数每10次挂起一次。实际上,HttpWebResponse.Timeout不能正常工作(或者它可以正常工作,但我不知道如何使用它)。所以一位So用户给了我这个解决方案: public class TimeoutInvoker { public static void Run(Action action, int timeout) {
public class TimeoutInvoker
{
public static void Run(Action action, int timeout)
{
var waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
AsyncCallback callback = ar => waitHandle.Set();
action.BeginInvoke(callback, null);
if (!waitHandle.WaitOne(timeout))
throw new TimeoutException("Timeout.");
}
}
然后像这样使用它:
TimeoutInvoker.Run(()=>ProxyIsGood(ip, port));
问题是我需要像这样使用它,带有一个返回值:
while( !(TimeoutInvoker.Run(()=>ProxyIsGood(ip, port)) )
{
reset_stuff();
}
那么如何修改TimeoutingVoker呢 您必须调用
EndInvoke
来检索异步调用的结果
将您的班级改为:
public class TimeoutInvoker
{
public static TResult Run<TResult>(Func<TResult> action, int timeout)
{
var waitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
AsyncCallback callback = ar => waitHandle.Set();
IAsyncResult result = action.BeginInvoke(callback, null);
if (!waitHandle.WaitOne(timeout))
throw new TimeoutException("Timeout.");
return action.EndInvoke(result);
}
}
请注意,这只会在超时时引发异常(并且不会使用
CancellationToken
)。您的代码用法与您要求的不同。似乎您希望timeoutingvoker.Run
返回bool
。这是正确的吗?那么为什么不将Run
方法的符号从void
更改为bool
,并在该方法结束时返回true
?@astander,因为这样无论ProxyIsGood
返回什么,它都将始终返回true
。这正是我所需要的,它就像一个符咒!谢谢
public class TimeoutInvoker
{
public static TResult Run<TResult>(Func<TResult> action, int timeout)
{
var task = Task.Factory.StartNew(action);
if (task.Wait(timeout))
return task.Result;
throw new TimeoutException("Timeout.");
}
}