在一个新线程中运行vb.net

时间:2011-02-06 20:30:23

标签: vb.net

如何强制一组特定的vb.net代码在新的线程或进程中运行。?

编辑1:我正在vb.net中尝试TTS,但每当点击播放按钮时,整个节目会冻结,在演讲结束之前我无法做任何其他事情

3 个答案:

答案 0 :(得分:3)

在下面的评论中,您提到了您正在使用的库,这会改变整个答案。

回答您的问题:
在您的情况下,因为您正在使用SAPI.SpVoice库,所以您不需要执行与启动后台线程相关的任何工作,因为该对象支持异步回放。查看Speak方法的参数。以下是文档:http://msdn.microsoft.com/en-us/library/ms723609(v=vs.85).aspx

回答你提出的问题:
最简单的方法是使用后台工作进程来运行一些代码。这将允许您的程序运行一些长的过程而不是阻止UI线程。后台工作者甚至提供事件来通知UI线程它的进度。

以下是MSDN http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

的链接

后台工作程序是将一些工作分拆到另一个线程的简单方法,还有其他工具可用于更复杂的方案。本质上,您创建一个后台工作器对象的实例,并将长时间运行的代码添加到为处理它的DoWork事件而创建的函数中。还应该处理ProgressChanged和RunWorkerCompleted事件。可以调用一些方法来取消该过程。上面的MSDN链接提供了一些很好的完整代码示例。

答案 1 :(得分:1)

将“代码集”包装到方法中并将其转储到ThreadPool

   ThreadPool.QueueUserWorkItem(AddressOf MyMethod)

答案 2 :(得分:1)

ThreadPool建议对我来说适用于WP7 Silverlight应用程序:

  Private Sub AddAnagrams()
    ClearAnagramsList()
    UpdateAnagramsCount() 'update the count first, then add the items
    ShowCalculating(True)
    ThreadPool.QueueUserWorkItem(AddressOf UpdateAnagramsOnUIthread)
  End Sub

  Private Sub UpdateAnagramsOnUIthread()
    Dispatcher.BeginInvoke(AddressOf UpdateAnagrams)
  End Sub

  Private Sub UpdateAnagrams()
    ListAnagrams.ItemsSource = _Combinator.CombinedItems 'this is a virtualized datasource
    ShowCalculating(False)
  End Sub

  Private Sub ShowCalculating(ByVal flag As Boolean)
    LblCalculating.Visibility = If(flag, Windows.Visibility.Visible, Windows.Visibility.Collapsed)
  End Sub