我编写了一个我已经开始使用start方法的线程,但是我无法知道线程何时执行了该方法并销毁了线程对象。
_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
什么是最好的方法。请帮忙。此外,我想在线程执行完该方法后调用一个方法。
答案 0 :(得分:2)
首先,将变量设置为Nothing不会破坏对象。
其次,如果这是一个实例变量,但在启动线程后你不需要它,为什么还要保留它呢?如果它是局部变量,那就让它超出范围。
基本上,你不应该“破坏”对象 - 只要你对它感兴趣,你就可以只保留对它的引用。
如果这没有帮助,请提供更多详细信息。
答案 1 :(得分:2)
如果我理解正确,你想等一个线程完成。这可以通过 joining 线程来完成:
_ProgressThread = New Thread(AddressOf ExecProc)
_ProgressThread.IsBackground = False
_ProgressThread.Start()
// you can do parallel work here
// wait for the thread to finish
_ProgressThread.Join();
答案 2 :(得分:1)
有两种(或更多种)可能的方法。一种是使用ManualResetEvent
,如下所示:
_Event = New ManualResetEvent(False); <-- Create event globally
然后,在你的主题的开始代码中:
_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.
_Event.WaitOne(); <-- This waits!
_Event.Close(); <-- This closes the event
Me.MainInit()
_ProgressThread = Nothing
在你的线程方法中,你必须在方法返回所有情况之前调用_Event.Set()
,否则你的应用程序将被阻止。
另一种方法是在完成时必须线程调用委托。完成线程后要执行的代码(Me.MainInit()
)将进入委托方法。这实际上非常优雅。
例如:
public delegate void ThreadDoneDelegate();
private void ExecProc()
{
ThreadDoneDelegate del = new ThreadDoneDelegate(TheThreadIsDone);
... // Do work here
this.Invoke(del);
}
private void TheThreadIsDone()
{
... // Continue with your work
}
抱歉,我不会流利地说VB,所以你必须转换这个小C#片段: - )