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;
}