繁体   English   中英

我如何等待委托人返回某个值?

[英]How do I wait for a delegate to return a certain value?

我目前正在使用Selenium WebDriverWait等待不需要IWebDriver功能的地方发生的事情。 我的代码如下所示:

public static T WaitForNotNull<T>(this IWebDriver driver, Func<T> func)
{
    var result = default(T);

    var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
    wait.Until(d => (result = func()) != null);

    return result;
}

public static void WaitForNull<T>(this IWebDriver driver, Func<T> func)
{
    var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
    wait.Until(d => func() == null);
}

.Net中是否可以使用类似的结构代替WebDriverWait?

答案是

没有

.NET Framework中没有这样的东西,您必须自己编写这样的方法。

这是原始的直到实现( )。 您可以改进它IMO。

而且,如果您不想阻塞调用线程(对于UI线程),则可以轻松使用async \\ await模式

    public TResult Until<TResult>(Func<T, TResult> condition)
    {
        if (condition == null)
        {
            throw new ArgumentNullException("condition", "condition cannot be null");
        }

        var resultType = typeof(TResult);
        if ((resultType.IsValueType && resultType != typeof(bool)) || !typeof(object).IsAssignableFrom(resultType))
        {
            throw new ArgumentException("Can only wait on an object or boolean response, tried to use type: " + resultType.ToString(), "condition");
        }

        Exception lastException = null;
        var endTime = this.clock.LaterBy(this.timeout);
        while (true)
        {
            try
            {
                var result = condition(this.input);
                if (resultType == typeof(bool))
                {
                    var boolResult = result as bool?;
                    if (boolResult.HasValue && boolResult.Value)
                    {
                        return result;
                    }
                }
                else
                {
                    if (result != null)
                    {
                        return result;
                    }
                }
            }
            catch (Exception ex)
            {
                if (!this.IsIgnoredException(ex))
                {
                    throw;
                }

                lastException = ex;
            }

            // Check the timeout after evaluating the function to ensure conditions
            // with a zero timeout can succeed.
            if (!this.clock.IsNowBefore(endTime))
            {
                string timeoutMessage = string.Format(CultureInfo.InvariantCulture, "Timed out after {0} seconds", this.timeout.TotalSeconds);
                if (!string.IsNullOrEmpty(this.message))
                {
                    timeoutMessage += ": " + this.message;
                }

                this.ThrowTimeoutException(timeoutMessage, lastException);
            }

            Thread.Sleep(this.sleepInterval);
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM