title: Update Text Box Properly when Cross-threading in Visual Basic (VS 2012 V11)
body: <ul>
  <li><p>Here is my question in short: <strong>How do I use the BackGroundWorker (or InvokeRequired method) to make thread-safe calls to append text to a text box?</strong></p></li>
  <li><p>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:</p>
  
  <pre><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 &amp; "\" &amp; e.Name, True)
      TextBox3.ApendText("[New Text]") ' This line causes an error
  End Sub
  </code></pre></li>
  </ul>
  
  <p>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.</p>
  
  <p>The error that is caused is:</p>
  
  <blockquote>
    <p>Cross-thread operation not valid: Control 'TextBox3' accessed from a
    thread other than the thread it was created on.</p>
  </blockquote>
  
  <p>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:</p>
  
  <p><a href="http://msdn.microsoft.com/en-us/library/ms171728%28v=vs.80%29.aspx?cs-save-lang=1&amp;cs-lang=vb#code-snippet-1" rel="nofollow">How to: Make Thread-Safe Calls to Windows Forms Controls</a> </p>
  
  <p>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:</p>
  
  <pre><code>' 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
  </code></pre>
  
  <p>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, <strong>How do I use the BackGroundWorker (or InvokeRequired method) to make thread-safe calls to append text to a text box?</strong> (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.)</p>