Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.Net线程执行_.net_Vb.net_Multithreading - Fatal编程技术网

.Net线程执行

.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

我已经编写了一个线程,我已经开始使用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 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线程。有关更多详细信息,请参阅