2017-02-22 48 views
0

我有一個關於Visual Studio 2010 C sharp中的延遲的問題。 我需要時間延遲在程序中發送位置到伺服。現在我正在使用System.Threading.Thread.Sleep(200))但我需要延遲,我可以interupt。延遲程序就像睡覺()

當我使用睡眠時,該程序在睡眠過程中不起作用。 (點擊按鈕,軌跡欄移動...),但我必須在延遲期間控制程序。

什麼是存在於VS像功能睡眠?

非常感謝您的回覆。

馬丁

+0

當你說「VS中存在什麼......」時,你的確是這樣認爲的:「Visual Studio中只存在IDE而不是語言。」 –

+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 
} 
+0

想想你可能會混合使用幾種語言哈哈。在C#中沒有'function'關鍵字 –

+1

感謝您指出這一點,我正在使用Javascript#。 –

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

你可以工作的過程中異步任務,而不阻止您的應用程序..因爲你正在使用VS2010使用Task.Delay()(它唯一的塊當前任務)

public async Task SomeWork() 
    { 
     while (someCondition) 
     { 
      //do some work 
      await Task.Delay(100);//milliseconds 
     } 
    } 
0

,你不會有權訪問C#5功能(異步/正在等待關鍵字),並且很可能僅限於.NET 4.0。不幸的是,該版本沒有Task.Delay方法。

如果是這種情況,最簡單的選擇可能使用System.Threading.TimerSystem.Timers.Timer根據您的需要。兩者都會在延遲後在線程池線程上執行一個方法。您可以在打勾前停止他們兩人,並且他們都支持「無限」期間。

停止線程計時器不明顯,使用Timer.Change方法。

上面的鏈接有很好的使用示例。