C#如何等待X秒以完成任务
我希望在不阻塞线程的情况下,根据任务是否完成并执行某些工作,等待任务完成指定的时间。C#如何等待X秒以完成任务,c#,task,delay,C#,Task,Delay,我希望在不阻塞线程的情况下,根据任务是否完成并执行某些工作,等待任务完成指定的时间。 e、 g.等待HTTP请求一段特定的时间。计算结束时间,然后等待该时间过去 public void TrySomething(int sec) { DateTime endTime = DateTime.Now.AddSeconds(sec); while (DateTime.Now < endTime) { // do useful stuff } }
e、 g.等待HTTP请求一段特定的时间。计算结束时间,然后等待该时间过去
public void TrySomething(int sec)
{
DateTime endTime = DateTime.Now.AddSeconds(sec);
while (DateTime.Now < endTime)
{
// do useful stuff
}
}
public void TrySomething(整数秒)
{
DateTime endTime=DateTime.Now.AddSeconds(秒);
while(DateTime.Now
秒表
是一种方法:
public void TrySomething(int sec)
{
var sw = Stopwatch.StartNew();
while (sw.Elapsed.TotalSeconds < (double)sec)
{
// do useful stuff
}
}
通常,您可以使用CancellationTokenSource,如果时间段已过,它会将tokens 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限制的工作。但您表示要检查您的internet连接,这是IO绑定的工作。您仍然可以使用Task.Run,但在本例中,这是非常不受欢迎的。最佳解决方案是使用适当的异步方法检查internet连接,例如,如果使用Ping.Send检查internet连接,则应使用Ping.sendsync等
在这种情况下,您的代码将是:
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;
}
var ct=new CancellationTokenSource(TimeSpan.FromSeconds(sec)).Token;
等待尝试(ct);
公共异步任务TrySomethingAsync(取消令牌ct)
{
var valueToReturne=假;
而(!ct.iscancellationrequest)
{
如果(!等待MyConditionAsync(ct))
继续;
其他的
valueToReturne=真;
}
返回值返回;
}
对于秒
第二个应用程序没有响应。我希望应用程序在循环过程中响应。不要使用日期时间
-对于这种情况使用秒表
。是否要继续检查“MyCondition”直到其为真,但在x秒后“超时”?所以,如果MyCondition为真,您将立即返回,但如果它从未计算为真,那么您将等待x秒,等待它可能发生更改,如果不返回?还是你想一直等x秒?@Dave first One你得到了古怪的答案,因为人们不明白你想做什么。“在秒之后返回内容”和“在秒期间返回内容”之间有什么区别?什么是MyCondition
?很抱歉,我没有告诉我们你想做什么,这显然是我的缺点,因为我的英语说得太差了。我想做的最好的例子是一个在开始时检查互联网连接的程序。此程序持续2秒钟检查internet连接,如果有连接程序立即进入下一步,如果2秒钟后没有连接,用户可以单击按钮重试连接internet。这就是我想要建立的。
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;
}