程序延迟如睡眠()

时间:2017-02-22 21:30:18

标签: c#

我有一个关于Visual Studio 2010 C sharp延迟的问题。 我需要在程序中延迟发送位置到伺服。现在我正在使用 System.Threading.Thread.Sleep(200)),但我需要延迟,我可以中断。

当我使用睡眠时,睡眠期间该程序无法正常工作。 (点击按钮,轨迹栏移动......),但我必须在延迟期间控制程序。

VS中存在什么样的函数睡眠?

非常感谢您的回复。

马丁

3 个答案:

答案 0 :(得分:1)

您可以使用Task.Delay

https://msdn.microsoft.com/en-us/library/hh194845(v=vs.110).aspx

public void mainFunction() {
  //do stuff here
  var delayTime = 1.5;
  CancellationTokenSource source = new CancellationTokenSource();
  var t = Task.Run(async delegate
  {
     await Task.Delay(TimeSpan.FromSeconds(delayTime), source.Token);
     delayableFunction();
  });

  //can cancel here if necessary
  source.Cancel();
  //just continue on with other stuff... 
}

public void delayableFunction() {
  //do delay-able stuff here
}

答案 1 :(得分:1)

使用带有取消令牌的异步Task.Delay()功能

这是一个简单的例子:

bool sendPos = true;

public async Task SomeFunction(CancellationToken token)
{
    while (sendPos)
    {
        SendServoPos();
        await Task.Delay(1000, token)
    }
}

public void MainFunction()
{
    var tokenSource = new CancellationTokenSource();

    // Fire and Forget - Note it will silently throw exceptions
    SomeFunction(tokenSource.Token)

    // Cancel Loop
    sendPos = false;
    tokenSource.Cancel();
}

答案 2 :(得分:0)

由于您使用的是VS2010,因此无法访问C#5 功能( async / 等待关键字),并且很可能是仅限于.NET 4.0。不幸的是,该版本没有Task.Delay方法。

如果是这种情况,最简单的选择可能是System.Threading.TimerSystem.Timers.Timer,具体取决于您的需求。两者都会在延迟后在线程池线程上执行一个方法。您可以在勾选之前停止它们,并且它们都支持“无限”时段。

停止线程计时器并不明显,请使用Timer.Change方法。

上面的链接有很好的用法示例。