.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
)可以查看。这不是完全一样的事情,但这是一种方法。