2011-08-21 39 views
2

我是一个VB6编码和我正在迁移到VB8/VB.NET等待在VB2008/vb.net

我知道如何在VB6等待,但我的问题是,我不知道如何在VB8/VB.NET中等待。我有一个名为textbox2TextBox,其中包含我想等待的秒数。我曾经在VB6中使用wait 60,但当然VB2008是不同的。

任何人都可以帮助我做到这一点?

+0

等待在一个GUI应用程序是一个相当大的禁止。使用计时器进行延期操作。 –

+0

@nick请花点时间,并尝试阅读答案,然后再次发布相同问题。在你问另外两个人怎么做之前,我已经给你如何在我的答案中获得TextBox的内容。我给出了三种不同的可能的答案,如何等待,提到第一个会挂起,然后反正你试了一下,并报告:惊讶,它挂起。然而,我的帖子的* rest *有两个* other *选项:等待While和使用Application.DoEvents和System.Timers.Timer的小型Sleep。慢慢来。你的答案都在那里。 – shelleybutterfly

回答

0

使用Thread.Sleep

Thread.Sleep(60000) 

更新,以下评论:

要检索并转换成文本框中使用的值:

Dim sleepValue As Integer = Integer.Parse(textbox2.Text) 

这将抛出一个异常如果该值无法转换。

+0

是的,但我想60000两个是textbox2我该怎么做? – nick

+0

@nick - 答案已更新。 – Oded

+0

那么完整的代码是什么? – nick

-1

我不知道为什么你要它,为什么你不使用线程,但在VB6这sleep功能的行为类似wait

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    MsgBox("begin") 
    Sleep(2000) 
    MsgBox("end") 
End Sub 
+0

为什么在BCL中内置函数时pInvoke? – Oded

+0

我想两个等待在文本框2中有多少秒钟 – nick

+1

用Sleep(int(textbox2.text))代替Sleep(2000)) – Maysam

0

[编辑:我重新阅读问题。看到有人专门问名为textbox2一个TextBox所以我已经更新了答案,以反映]

嗯,我想一个答案是使用:

System.Threading.Thread.Sleep(Int32.Parse(textbox2.Text) * 1000); 

如果您的文本框包含等待的秒数。但是,如果您不在后台线程中,则会在您等待的时间内挂起应用程序。

你也可以这样做:

Dim StartTime As DateTime 
StartTime = DateTime.Now 

While (DateTime.Now - StartTime) < TimeSpan.FromSeconds(Int32.Parse(textbox2.Text)) 
    System.Threading.Thread.Sleep(500) 
    Application.DoEvents() 
End While 

,而你等待这不会挂断UI。 (此外,您可以使用Convert.Int32(textbox2.Text)来转换文本框中的数据。)

噢,在某些情况下,您可以避免UI锁定问题的另一种方法是执行一个定时器回调代替。 (见http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx一些更多的细节。)要做到这一点,你

  • 做任何你需要处理的暂停
  • 之前做创建拿起你离开了
  • 创建一个定时器处理功能调用你的函数之后

代码:

Public Class MyClass 

    Public MyTimer As System.Timers.Timer 

    Public Sub OnWaitCompleted(source As Object, e As ElapsedEventArgs) 
     MyTimer.Stop() 
     MyTimer = Nothing 
     DoSecondPartOfProcessing() 
    End Sub 

    Public Sub DoFirstPartOfProcessing() 
     ' do what you need to do before the wait 

     MyTimer = New System.Timers.Timer(Int32.Parse(textbox2.Text)) 
     AddHandler MyTimer.Elapsed, AddressOf OnWaitCompleted 

     MyTimer.Start() 
    End Sub 

    Public Sub DoSecondPartOfProcessing() 
     ' do what you need to do after the wait 
    End Sub 
End Class 
+0

当你不知道参数的类型时,你也可以使用'Convert'对象,例如'Convert.ToInt32(txtMyTextBox.Text)'做转换 – shelleybutterfly

+0

如果你需要的代码为(textbox2.Text)'或'Convert.ToInt32(textbox2.Text)' – shelleybutterfly

+0

System.Threading.Thread.Sleep(Int32.Parse(textbox2.Text)* 1000); – nick

0

使用这个做那个你的用户界面不会挂起。

For i = 1 to 300 
threading.thread.sleep(i * 1000) 
application.doevents 
next 
+0

取决于DoEvents调用需要多长时间,但这可能需要比300秒长得多的时间。 – shelleybutterfly

+0

我想要两个等待文本框2中有多少秒 – nick

0

尝试使用计时器

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click 
    Dim interval As Integer = 0 

    If Integer.TryParse(Me.TextBox2.Text, interval) Then 
     Timer1.Enabled = True 
     Timer1.Interval = interval 
     Timer1.Start 
    End If 
End Sub 

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick 
    'your code here 
End Sub 

在“计时器事件蜱然后实现调用方法Timer.Stop()的逻辑,但是这取决于你怎么做。

问候。

3

我知道这是一个古老的问题,但我认为有这么多冲突的答案,我认为我使用的解决方案非常简单和直接。 另外,出于与OP相同的原因,我从VB6切换到.net时写了这个。

Private Sub Wait(ByVal seconds As Long) 
    Dim dtEndTime As DateTime = DateTime.Now.AddSeconds(seconds) 
    While DateTime.Now < dtEndTime 
     Application.DoEvents() 
    End While 
End Sub