2011-03-01 42 views
1

我有以下代碼。如果Upload方法需要超過一分鐘才能完成,會發生什麼情況?計時器在一分鐘結束後立即啓動另一個對Upload方法的調用,或者等待該方法結束執行後再執行嗎?我正在實施這個作爲一個Windows服務。如果回調方法的時間超過指定的時間段,會發生什麼情況?

Protected Overrides Sub OnStart(ByVal args() As String)  
    Dim tmr As Timer = New Timer(New TimerCallback(AddressOf Upload), Nothing, 1000, **60000**) 

    While Not tmr Is Nothing 
    End While 
End Sub 

Public Sub Upload(ByVal o As Object) 
    Dim sr As StreamReader 
    .......... 
    .......... 
End Sub 

回答

1

雖然一些你的代碼是混淆(與While環路什麼?),我可以說的是,在Timer將從ThreadPool開球另一個Thread

您可以使用Monitor,ReaderWriterLockSlimlock來控制重入。你需要一個對象鎖定到和其他的東西扎入你的要求(即指定的整數告訴Monitor嘗試爲X毫秒,其中0意味着我們想要立即鎖定):

VB.NET:

Private ReadOnly LockerObject As Object = New Object() 

If (Monitor.TryEnter(LockerObject, 0)) Then 
    Try 
     'do your processing 
    Catch 

    Finally 
     'always release the lock 
     Monitor.Exit(LockerObject) 
    End Try 
End If 

C#:

private readonly object LockerObject = new object(); 

if (Monitor.TryEnter(LockerObject, 0)) 
{ 
    try 
    { 
     //do your processing 
    } 
    catch 
    { 
    } 
    finally 
    { 
     //always release the lock 
     Monitor.Exit(LockerObject); 
    } 
} 
else 
{ 
    //do something else here if needs be. 
} 

編輯:哎呀,這是VB.NET!讓我轉換我的代碼...

+0

我用while循環讓我的計時器永久運行。用while循環我的程序結束了。 我會嘗試這種鎖定機制,並讓你知道。 謝謝你的解決方案.. – user536652 2011-03-01 15:29:40

+0

啊,我明白了,當它作爲Windows服務運行時,你不會需要它,但對於仿真,我推薦使用Console.Write(「按任意鍵停止仿真「); Console.ReadKey();'。 – 2011-03-01 15:33:21

+0

這隻在一個控制檯應用程序中,顯然是使用您創建的服務類! – 2011-03-01 19:50:21

相關問題