我想在循环期间执行某些操作并返回值 经过一段时间后。 像这样的东西。
public bool TrySomething(int sec)
{
var valueToReturne=false;
while (true)
{
if (!MyCondition)
continue;
else
valueToReturne = true;
}
return valueToReturne;
}
如你所知,这段代码永远不会出现
但是我希望在sec
秒之后离开。
我对Timer()
,async method
和Thread.Sleep()
了解一点
但
那还不够。
所以我怎么能做我想要的。我也不想冻结应用程序
所以我认为Thread.Sleap()
可以帮助我。
我想要做的最好的例子是一个在开始时检查互联网连接的程序。此程序2秒检查互联网连接,如果有连接程序立即进入下一步,如果2秒后没有连接,用户可以点击按钮重试连接到互联网。这就是我想要建立的。 主要问题是,在几乎所有答案中,程序在指定时间内没有响应
答案 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
}
}