如何强制一组特定的vb.net代码在新的线程或进程中运行。?
编辑1:我正在vb.net中尝试TTS,但每当点击播放按钮时,整个节目会冻结,在演讲结束之前我无法做任何其他事情
答案 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