.net 更改从其他线程创建的窗体上创建的文本字段的文本属性

.net 更改从其他线程创建的窗体上创建的文本字段的文本属性,.net,vb.net,multithreading,winforms,.net,Vb.net,Multithreading,Winforms,假设我有一个有两个窗体的应用程序,我在主窗体中,希望在一个单独的线程中创建另一个窗体,作为在主窗体中执行的很长进程的状态监视器。所以我想更改状态监视器文本框的文本属性,但问题是另一个线程上的第二个表单 我正在使用的代码 Dim _thread As Threading.Thread = New Threading.Thread(Sub() Using frm As New frmProcessMonitor

假设我有一个有两个窗体的应用程序,我在主窗体中,希望在一个单独的线程中创建另一个窗体,作为在主窗体中执行的很长进程的状态监视器。所以我想更改状态监视器文本框的文本属性,但问题是另一个线程上的第二个表单

我正在使用的代码

 Dim _thread As Threading.Thread = New Threading.Thread(Sub()
                                    Using frm As New frmProcessMonitor
                                       Application.Run(frm)
                                           End Using
                                           End Sub)
      _thread.Start()

因此,请了解如何在这种方法中做到这一点。

我将研究System.Threading.Tasks.Task

差不多

var frmCreationTask = Task.TaskFactory.StartNew(() => { /*Form generation code here */ }).ContinueWith(() => { //code to change the property } );

代码是c语言的,但是移植到VB应该很容易。

即使它可以工作(在某些选中的条件下),您也不应该在UI上混合使用不同的线程。只需创建一个表单并将其显示为.Show()(从主线程开始,长时间运行的进程通知可以通过BeginInvoke()发送给它)。不需要它并行启动一个消息泵。此外,正确的(如果我们可以说正确的话)是创建一个表单,然后用ShowDialog()显示它,Application.Run()做的远不止这些。Adriano,请给我一个解释示例。Adriano,你认为如果第二个表单有一个带有选框样式的进度条,它会被冻结,直到调用线程完成它的工作。你必须这样做:在主线程中创建状态表单,用
Show()
(或者
ShowDialog()
如果是模态)显示。在另一个线程中运行长时间任务(或
BackgroundWorker
)。进度条不会被冻结,您可以通过一个简单的
BeginInvoke()
到它的
close()
方法来关闭状态窗体(从另一个线程)。例如(使用
BackgroundWorker
)可以查看。这不是完全一样的事情,但这是一种方法。