2013-08-20 20 views
0

該項目針對.net 2.0。我在使用一個新的線程實例化的方法:Thread.Sleep在後臺線程中使用100%來自一個系統處理器

myThread = New Threading.Thread(AddressOf myClass.MyMethod) 
myThread.Start() 

子是這樣的:

Sub myMethod() 
    Dim fs As New IO.FileInfo(sFile) 
    While Not DateDiff(DateInterval.Second, 
        dtCurrentTime, Now()) > iTimeOutInSeconds 
    fs.Refresh() 
    If fs.Exists Then 
     fs.Refresh() 
     If fs.Length > 0 AndAlso fs.Length = iGrowing Then 
     bFileExists = True 
     Exit While 
     End If 
     iGrowing = fs.Length 
     System.Threading.Thread.Sleep(1000) 
    End If 
    End While 
End Sub 

我等到文件停止增長。問題是,如果我從主線程調用它,如:

Call myClass.MyMethod() 

它工作正常,很少處理器功耗被消耗。但是如果我在單獨的線程中調用它,則會消耗一個核心機器中的所有處理器能力,或者多核心機器中的一個核心。 任何人都知道另一種做法,「延遲」沒有超過procesor?

+0

這是非常脆弱的代碼。如果負責「增長」文件的進程得到短暫的優先權,會怎樣?你的代碼會錯誤地認爲文件已經完成增長,並繼續做它將要做的事情。糟糕,那麼其他進程就會回到修改文件!您需要使用通知,而不是連續輪詢。讓其他程序*在完成修改文件時告訴你*。 –

+2

該代碼在文件不存在時燒錄100%核心。 DateDiff()返回一個數字,對數字使用Not運算符根本沒有意義。很難猜測是什麼意圖。 –

+0

@HansPassant - 也許你錯過了該行末尾的iTimeOutInSeconds? :) –

回答

1

你有這樣的代碼:

While Not (...) 
    If fs.Exists Then 
     ' do stuff 
     Thread.Sleep(...) 
    End If 
End While 

因此,如果文件不存在,也沒有睡覺。

我不能說副手爲什麼你會有不同的行爲在主線程比在後臺線程。你確定這是發生了什麼?

+0

我再次嘗試了代碼,是的,如果在主線程上執行,可以正常工作,如果在單獨的線程上執行,則會佔用處理器資源(和工作) –

相關問題