C#如何在X秒之后退出while循环

时间:2018-02-18 21:57:50

标签: c# timer delay

我想在循环期间执行某些操作并返回值 经过一段时间后。 像这样的东西。

public bool TrySomething(int sec)
{
    var valueToReturne=false;
    while (true)
    {
        if (!MyCondition)
                    continue;
        else
                    valueToReturne = true;
    }
    return valueToReturne;
}

如你所知,这段代码永远不会出现 但是我希望在sec秒之后离开。 我对Timer()async methodThread.Sleep()了解一点 但 那还不够。 所以我怎么能做我想要的。我也不想冻结应用程序 所以我认为Thread.Sleap()可以帮助我。

更新

我想要做的最好的例子是一个在开始时检查互联网连接的程序。此程序2秒检查互联网连接,如果有连接程序立即进入下一步,如果2秒后没有连接,用户可以点击按钮重试连接到互联网。这就是我想要建立的。 主要问题是,在几乎所有答案中,程序在指定时间内没有响应

3 个答案:

答案 0 :(得分:3)

计算你的结束时间,然后等到那个时间过去。

public void TrySomething(int sec)
{
    DateTime endTime = DateTime.Now.AddSeconds(sec);
    while (DateTime.Now < endTime)
    {
         // do useful stuff
    }
}

答案 1 :(得分:2)

通常,您可以使用CancellationTokenSource,如果周期已过,则会将标记IsCancellationRequested属性设置为true。因此你的代码就是。

public bool TrySomething(int sec)
{
    var ct = new CancellationTokenSource(TimeSpan.FromSeconds(sec)).Token;
    var valueToReturne=false;
    while (!ct.IsCancellationRequested)
    {
        if (!MyCondition)
                    continue;
        else
                    valueToReturne = true;
    }
    return valueToReturne;
}

然而,与其他解决方案类似,这是一个繁忙的循环意味着阻止你的主线程。

如果您希望停止编程而不响应,则需要使您的方法异步,例如通过在Task.Run中包装TrySomething,例如

var ct = new CancellationTokenSource(TimeSpan.FromSeconds(sec)).Token;
await Task.Run(() => TrySomething(ct), ct);

public bool TrySomething(CancellationToken ct)
{
    var valueToReturne=false;
    while (!ct.IsCancellationRequested)
    {
        if (!MyCondition)
                    continue;
        else
                    valueToReturne = true;
    }
    return valueToReturne;
}

但是,这只应该用于CPU绑定工作。但是你说你要检查你的互联网连接,这是IO限制的工作。你仍然可以使用Task.Run,​​但在这种情况下,这是非常不赞成的。最佳解决方案是使用适当的异步方法进行互联网连接检查,例如:如果你使用Ping.Send来检查互联网连接,你应该使用Ping.SendAsync等。

在这种情况下,您的代码将是:

var ct = new CancellationTokenSource(TimeSpan.FromSeconds(sec)).Token;
await TrySomething(ct);

public async Task<bool> TrySomethingAsync(CancellationToken ct)
{
    var valueToReturne=false;
    while (!ct.IsCancellationRequested)
    {
        if (!await MyConditionAsync(ct))
                    continue;
        else
                    valueToReturne = true;
    }
    return valueToReturne;
}

答案 2 :(得分:0)

sc.lookup(".default-color0.chart-series-line").setStyle("-fxstroke: transparent"); 是要走的路:

Stopwatch

甚至:

public void TrySomething(int sec)
{
    var sw = Stopwatch.StartNew();
    while (sw.Elapsed.TotalSeconds < (double)sec)
    {
         // do useful stuff
    }
}