Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从操作返回值_C#_.net_Delegates - Fatal编程技术网

C# 如何从操作返回值

C# 如何从操作返回值,c#,.net,delegates,C#,.net,Delegates,我有一个代理测试功能。在它里面我有一个catch块,在指定的时间量(超时)之后,如果代理不好,我返回一个false标志。问题是,即使没有异常存在,函数每10次挂起一次。实际上,HttpWebResponse.Timeout不能正常工作(或者它可以正常工作,但我不知道如何使用它)。所以一位So用户给了我这个解决方案: public class TimeoutInvoker { public static void Run(Action action, int timeout) {

我有一个代理测试功能。在它里面我有一个catch块,在指定的时间量(超时)之后,如果代理不好,我返回一个false标志。问题是,即使没有异常存在,函数每10次挂起一次。实际上,HttpWebResponse.Timeout不能正常工作(或者它可以正常工作,但我不知道如何使用它)。所以一位So用户给了我这个解决方案:

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.");
    }
}