.Net线程执行

时间:2010-06-11 09:29:07

标签: .net vb.net multithreading

我编写了一个我已经开始使用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

什么是最好的方法。请帮忙。此外,我想在线程执行完该方法后调用一个方法。

3 个答案:

答案 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#片段: - )