在Visual Basic中跨线程时正确更新文本框(V​​S 2012 V11) [英] Update Text Box Properly when Cross-threading in Visual Basic (VS 2012 V11)

查看:77
本文介绍了在Visual Basic中跨线程时正确更新文本框(V​​S 2012 V11)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  • 以下是我的简短问题:如何使用BackGroundWorker(或InvokeRequired方法)进行线程安全调用,以将文本追加到文本框?

这是我的很多细节和背景问题:我一直在研究一种程序,该程序将文件从一个位置复制到另一个位置以进行备份.我设置了一个选项,当使用FileSysteWatcher修改文件时,该文件将保存文件.这是代码:

Here is my question in with much detail and background: I've been working on a program that copies file from one location to another for backup purposes. I set an option that will save a file when the file is modified using the FileSysteWatcher. Here is the code:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim directoryPath As String = Path.GetDirectoryName(TextBox1.Text)
    Dim varFileSystemWatcher As New FileSystemWatcher()
    varFileSystemWatcher.Path = directoryPath

    varFileSystemWatcher.NotifyFilter = (NotifyFilters.LastWrite)
    varFileSystemWatcher.Filter = Path.GetFileName(TextBox1.Text)
    AddHandler varFileSystemWatcher.Changed, AddressOf OnChanged
    varFileSystemWatcher.EnableRaisingEvents = True

End Sub

Private Sub OnChanged(source As Object, ByVal e As FileSystemEventArgs)

    My.Computer.FileSystem.CopyFile(e.FullPath, TextBox2.Text & "\" & e.Name, True)
    TextBox3.ApendText("[New Text]") ' This line causes an error
End Sub

除了更新textbox3中的文本外,该代码工作正常.修改指定的文件时,我需要文本框进行更新.这很重要,以便用户可以知道程序正在运行,并完整记录程序操作.

The code works fine except for updating the text in textbox3. I need the textbox to update when the file specified is modified. This is important so that the user can know the program is working and to have a complete log of the programs operations.

引起的错误是:

跨线程操作无效:控件'TextBox3'从 除了创建线程以外的其他线程.

Cross-thread operation not valid: Control 'TextBox3' accessed from a thread other than the thread it was created on.

我假设"AddHandler varFileSystemWatcher.Changed,AddressOf OnChanged"创建了一个新线程.另外,以我的方式"更新"OnChange Sub"中的"textbox3"也不是线程安全的方式.所以我做了一些研究,发现了这篇文章:

I'm assuming "AddHandler varFileSystemWatcher.Changed, AddressOf OnChanged" creates a new thread. Also, updating "textbox3" within the "OnChange Sub" (in the way I did) is not a thread-safe manner. So I did some research and found this article:

本文介绍了可以使用InvokeRequired或BackgroundWorker进行线程安全的调用.我想使用BackgroundWorker进行线程安全的调用(如果InvokeRequired效率更高,那么我将使用它),但是示例中提供的这一部分让我感到困惑:

The article explains that one can use InvokeRequired or a BackgroundWorker to make thread-safe calls. I would like to use the BackgroundWorker to make a thread-safe call (if InvokeRequired is more efficient then I'll use that), but this portion, of the example provied, leaves me confused:

' Do I need these imports to use the BackgroundWorker or InvokeRequired?
Imports System
Imports System.ComponentModel
Imports System.Threading
Imports System.Windows.Forms

Public Class Form1
   Inherits Form ' Do I need this for what I am trying to do?

   ' This delegate enables asynchronous calls for setting
   ' the text property on a TextBox control.
   Delegate Sub SetTextCallback([text] As String)

   ' This thread is used to demonstrate both thread-safe and
   ' unsafe ways to call a Windows Forms control.
   Private demoThread As Thread = Nothing

   ' This BackgroundWorker is used to demonstrate the 
   ' preferred way of performing asynchronous operations.
   Private WithEvents backgroundWorker1 As BackgroundWorker

   Private textBox1 As TextBox
   Private WithEvents setTextUnsafeBtn As Button
   Private WithEvents setTextSafeBtn As Button
   Private WithEvents setTextBackgroundWorkerBtn As Button

   ' What is this part of the code for and do I need it?
   Private components As System.ComponentModel.IContainer = Nothing

   ' Again, What is this part of the code for and do I need it?
   Public Sub New()
      InitializeComponent()
    End Sub

   ' And again, What is this part of the code for and do I need it?
   Protected Overrides Sub Dispose(disposing As Boolean)
      If disposing AndAlso (components IsNot Nothing) Then
         components.Dispose()
      End If
      MyBase.Dispose(disposing)
    End Sub

上面代码的许多部分让我感到困惑.它有什么作用?使用BackgroundWorker我需要这段代码的哪些部分? InvokeRequired方法的哪些部分?再次,如何使用BackGroundWorker(或InvokeRequired方法)进行线程安全的调用,以将文本追加到文本框?(对上面的代码进行解释会很棒,但是我全真正需要的一个示例是如何以线程安全的方式更新文本框的文本.)

Many parts of the above code leave me confused. What does it do? What parts of this code do I need to use the BackgroundWorker? What parts for the InvokeRequired method? Again, How do I use the BackGroundWorker (or InvokeRequired method) to make thread-safe calls to append text to a text box? (It'd be great to have the code above explained, but all I really need is one example of how to update the text of a text box in a thread-safe manner.)

推荐答案

更改:

Private Sub OnChanged(source As Object, ByVal e As FileSystemEventArgs)
    My.Computer.FileSystem.CopyFile(e.FullPath, TextBox2.Text & "\" & e.Name, True)
    TextBox3.ApendText("[New Text]") ' This line causes an error
End Sub

收件人:

Private Sub OnChanged(source As Object, ByVal e As FileSystemEventArgs)
    My.Computer.FileSystem.CopyFile(e.FullPath, TextBox2.Text & "\" & e.Name, True)
    AppendTextBox(TextBox3, "[New Text]")
End Sub

Private Delegate Sub AppendTextBoxDelegate(ByVal TB As TextBox, ByVal txt As String)

Private Sub AppendTextBox(ByVal TB As TextBox, ByVal txt As String)
    If TB.InvokeRequired Then
        TB.Invoke(New AppendTextBoxDelegate(AddressOf AppendTextBox), New Object() {TB, txt})
    Else
        TB.AppendText(txt)
    End If
End Sub

这篇关于在Visual Basic中跨线程时正确更新文本框(V​​S 2012 V11)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆