2011-03-01 63 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

相关问题