.Net线程执行
我已经编写了一个线程,我已经开始使用start方法,但我无法知道线程何时执行完该方法并销毁了thread对象.Net线程执行,.net,vb.net,multithreading,.net,Vb.net,Multithreading,我已经编写了一个线程,我已经开始使用start方法,但我无法知道线程何时执行完该方法并销毁了thread对象 _ProgressThread = New Thread(AddressOf ExecProc) _ProgressThread.IsBackground = False _ProgressThread.Start() //the flow of execution should come here only after the thread has executed the meth
_ProgressThread = New Thread(AddressOf ExecProc)
_ProgressThread.IsBackground = False
_ProgressThread.Start()
//the flow of execution should come here only after the thread has executed the method
//but its coming and executing this line after the thread has started.
Me.MainInit()
_ProgressThread = Nothing
最好的方法是什么。请帮忙。我还想在线程执行完方法后调用一个方法。首先,将变量设置为Nothing不会破坏对象 其次,如果这是一个实例变量,但在启动线程后不需要它,为什么要保留它呢?如果它是一个局部变量,就让它超出范围 基本上,你不必“销毁”这个对象——只要你对它感兴趣,你就可以保留对它的引用
如果这没有帮助,请提供更多详细信息。首先,将变量设置为Nothing不会破坏对象 其次,如果这是一个实例变量,但在启动线程后不需要它,为什么要保留它呢?如果它是一个局部变量,就让它超出范围 基本上,你不必“销毁”这个对象——只要你对它感兴趣,你就可以保留对它的引用 如果这没有帮助,请提供更多详细信息。有两种(或更多)可能的方法。一种是使用
ManualResetEvent
,如下所示:
_Event = New ManualResetEvent(False); <-- Create event globally
抱歉,我不能流利地使用VB,因此您必须转换这个小小的C代码片段:-)有两种(或更多)可能的方法。一种是使用ManualResetEvent
,如下所示:
_Event = New ManualResetEvent(False); <-- Create event globally
抱歉,我说VB不流利,因此您必须转换这个小C代码片段:-)如果我理解正确,您需要等待线程完成。这可以通过线程来完成:
_ProgressThread = New Thread(AddressOf ExecProc)
_ProgressThread.IsBackground = False
_ProgressThread.Start()
// you can do parallel work here
// wait for the thread to finish
_ProgressThread.Join();
如果我理解正确,您需要等待线程完成。这可以通过线程来完成:
_ProgressThread = New Thread(AddressOf ExecProc)
_ProgressThread.IsBackground = False
_ProgressThread.Start()
// you can do parallel work here
// wait for the thread to finish
_ProgressThread.Join();
我想在线程执行完方法之后执行方法,但是在线程完成执行之前调用函数。@Soham:最简单的做法是不要直接为线程启动“ExecProc”,但是一个调用
ExecProc
然后执行另一个方法的方法。我想在线程执行完方法之后执行一个方法,但是函数在线程完成执行之前被调用。@Soham:最简单的方法是不要直接为线程启动“ExecProc”,但是调用ExecProc
然后执行另一个方法的方法。这不是问题。我了解两个世界。无论如何,谢谢。有一个问题是,我在thread方法中设置进度条的值,因此每次我在设置进度条值之前编写_event.set(),它都会从方法返回并执行maininit()方法。更新进度条时,您不会调用_event.set()。您只在线程方法真正退出之前调用它(可能是因为错误,也可能是因为它已完成)。但当我尝试更新进度条UI时,它停止增加并进入死锁。顺便说一下,我正在使用委托更新progressbar UI。请提供帮助。当然-由于主线程正在等待子线程结束(_event.WaitOne()),因此调用this.Invoke来更新进度条锁。如果您想更新进度条,我描述的第二种方法会更好,因为在这种情况下,主线程不会等待任何事情发生,这不是问题。我了解两个世界。无论如何,谢谢。有一个问题是,我在thread方法中设置进度条的值,因此每次我在设置进度条值之前编写_event.set(),它都会从方法返回并执行maininit()方法。更新进度条时,您不会调用_event.set()。您只在线程方法真正退出之前调用它(可能是因为错误,也可能是因为它已完成)。但当我尝试更新进度条UI时,它停止增加并进入死锁。顺便说一下,我正在使用委托更新progressbar UI。请提供帮助。当然-由于主线程正在等待子线程结束(_event.WaitOne()),因此调用this.Invoke来更新进度条锁。如果您想更新进度条,我描述的第二种方法会更好,因为在这种情况下,主线程不会等待任何事情发生。您说得很对,但Thorsten Dittmar的答案工作正常,唯一的问题是我的进度条UI没有更新,应用程序正在进入死锁。你能根据他的回答给我一些建议吗。不管怎样,还是要谢谢你。当你可以只使用线程obj时,创建一个事件有点过分了(IMHO)。无论如何,我想你是想更新线程内的progressbar,对吗?如果是这样,您需要使用control.invokererequired/control.Invoke()成员将调用整理回UI线程。有关更多详细信息,请参见“您完全正确”,但Thorsten Dittmar的回答是正确的,唯一的问题是我的progressbar UI没有更新,并且应用程序正在进入死锁。你能根据他的回答给我一些建议吗。不管怎样,还是要谢谢你。当你可以只使用线程obj时,创建一个事件有点过分了(IMHO)。无论如何,我想你是想更新线程内的progressbar,对吗?如果是这样,您需要使用control.invokererequired/control.Invoke()成员将调用整理回UI线程。有关更多详细信息,请参阅