2010-02-10 92 views
7

我用Google搜索這一點,並在這裏讀了一些線程,但我還沒有找到一個簡單的方法有一個VB.Net應用睡了一小會兒,仍然保持應用程序響應:簡單,無阻塞的睡眠方式?

Imports System.Net 
Imports System.IO 
Imports System.Text 
Imports System.Text.RegularExpressions 
Imports System.Threading.Thread 

[...] 

''#How to keep screen frop freezing? 
While True 
    ListBox1.Items.Clear() 

    ListBox1.Items.Add("blah") 

    ''#Not much difference 
    ListBox1.Refresh() 

    ''#Wait 1mn 
    Sleep(60000) 
End While 

是否真的有沒有簡單的非阻塞解決方案來讓VB.Net應用程序等待幾秒鐘?

謝謝。

+1

什麼是睡眠的目的是什麼?你要麼讓它睡覺,要麼讓它響應。如果你試圖做的是按照預定的時間間隔發生的事情,那就這麼說吧。 – dbasnett

+0

我每分鐘都在屏幕上刮一個網頁,並希望應用程序暫停每分鐘而不凍結應用程序屏幕。使用DoEvents還是可以的,或者推薦使用Timer嗎? – Gulbahar

+0

@OverTheRainbow - 請參閱下面的nikie的評論。聽起來你最好用定時器。 –

回答

7

這是WinForms還是WPF?

如果是WinForms,則可以使用計時器而不是while循環。那麼你的應用程序仍然會響應並且引發事件。

在WPF中,我認爲你將不得不根據DispatchTimer class製作自己的計時器。

+0

WPF中沒有定時器嗎? – CoderDennis

+0

我剛剛打開一個項目非常快,並沒有看到設計器中的任何Timer控件,所以很可能是,我從來沒有需要在WPF中使用它。谷歌的一個快速搜索讓我覺得它不可用(http://social.msdn.microsoft.com/forums/en-US/wpf/thread/aaffea95-e735-492d-bd8a-2fdf7099a936/)。 –

+0

它不一定是一個控件嗎?您可以在代碼中使用System.Timers.Timer或System.Threading.Timer。 – ryadavilli

2

定時器的建議確實是最好的方法。但是,如果DoEvents仍然有效(我因爲5.0沒有做過VB),你可以這樣做:

For i = 0 To 600 
    DoEvents 
    Sleep(100) 
Next 

這會做的0.1秒每600點睡覺,每個之間的DoEvents處理當前事件。 .1秒應該是響應性(事件在0.1秒內處理事件)和CPU消耗(這樣做太快並且即使在等待期間你的應用程序將開始消耗大量CPU時間)之間的良好折衷。

+0

親愛的downvoter,雖然我恭敬地接受你的downvote,你會考慮留下一個評論,我可以提高我的答案?謝謝。 – Wim

+0

我不知道爲什麼這是downvoted。這些函數在.NET中被稱爲Application.DoEvents和Thread.Sleep,但任何擁有最新MSDN的人都會發現這一點。應該指出的是,DoEvents可能會導致各種奇怪的行爲(例如,如果表單在函數運行時關閉,或者DoEvents再次調用相同的函數)。但是您確實說過,這不是理想的方式。 – Niki

+1

我不是downvoter,但DoEvents不是很好的做法。如果方法未被正確寫入以重新輸入帳戶,則會導致問題。 –

7
Public Sub ResponsiveSleep(ByRef iMilliSeconds As Integer) 
    Dim i As Integer, iHalfSeconds As Integer = iMilliSeconds/500 
    For i = 1 To iHalfSeconds 
     Threading.Thread.Sleep(500) : Application.DoEvents() 
    Next i 
End Sub 

Call ResponsiveSleep暫停特定代碼段,同時保持應用程序的相應響應。爲了使應用程序的響應iHalfSeconds可以被修改爲第二

+1

該方法使用的CPU資源少於秒錶。 – rsrobbins

+2

我遇到過'Application.DoEvents()'的問題。見[這裏](https://social.msdn.microsoft.com/Forums/vstudio/en-US/48b4a763-7387-46da-8fc2-3e885670f62c/the-undo-operation-encountered-a-context-that-is例如,不同的論壇= netfxbcl)。 – pelesl

+0

就是那個':'建構VB的特定東西?那在c#中看起來如何? – Nyerguds

4
Private Sub wait(ByVal interval As Integer) 
    Dim stopW As New Stopwatch 
    stopW.Start() 
    Do While stopW.ElapsedMilliseconds < interval 
     ' Allows your UI to remain responsive 
     Application.DoEvents() 
    Loop 
    stopW.Stop() 
End Sub 
2

真的,該解決方案是雙重的十分之一或百分之一: 1)使用一個定時器,而不是睡眠,睡眠確實因爲它說,原因線程睡覺。 2.)使用多線程並讓您的屏幕抓取功能在其自己的線程中運行,這將大大提高您的應用程序的響應速度。

Threading.Thread.Sleep(IntSleepTime) 

是線程安全的睡眠功能,將暫停在指定時間當前線程,因此,如果你使用的睡眠,可以在多線程環境這樣做,它會不斷的休息你應用程序響應,因爲你只是在睡覺一個分支線程,而不是主線程。

0

U是使UI線程交給窗體睡覺。 如果你想讓你的應用程序響應,首先創建一個方法,在列表視圖中添加項目,當你的表單加載時使用線程啓動該方法,現在使用sleep來使得列表視圖線程休眠,並且你將從響應中狀態..

0

這是VB不VBA

Private Async Function PauseTime(ByVal MS As Integer) As Task 

    Await Task.Run(Sub()       
          Thread.Sleep(MS) 

        End Sub) 


    End Function