Skip to content

The Dummy Programmer

Stories of daily programming

  • Home
  • The Dummy Programmer Robot
    • Overview
    • Version history & downloads
    • Tutorials
      • TDP Robot – The basics
      • A simple SQL Server backup solution
      • A simple SQL Server backup solution – A next step
  • My other dummy projects
  • Games
    • Space Y: An Asteroids clone
  • Services
    • What’s my user agent
    • What’s my IP address
  • Donate
  • About
  • Toggle search form

Make user interface calls in thread safe way in Windows Forms

Posted on May 23, 2020May 24, 2020 By

If you are working on a Windows Forms project and you are using threads in some way, by accessing the controls from a thread other than the main one, you may have received this error message:

System.InvalidOperationException: ‘Cross-thread operation not valid: Control ‘TxtCounter1′ accessed from a thread other than the thread it was created on.’

You can reproduce this error in an easy way: just create a Visual Studio project of type Windows Forms, put a textbox and a button, and attach the following click event handler to the button (import the necessary namespace to use the thread object):

private void BtnStartWork1_Click(object sender, EventArgs e)
{
   new Thread(() =>
   {
      for (int i = 0; i < 10000000; i++)
      {
         TxtCounter1.Text = i.ToString();
      }
    }).Start();
}

In this context, when you try to assign a value to TxtCounter1.Text, you will get the error above. To overcome the problem, just use the following function:

    private void MakeUISafeCall(Form form, Action act)
    {
        if (form.InvokeRequired)
        {
            form.Invoke(act);
        }
        else
        {
            act.Invoke();
        }
    }

And modify the click handler to use it:

    private void BtnStartWork1_Click(object sender, EventArgs e)
    {
        new Thread(() =>
        {
           for (int i = 0; i < 10000000; i++) 
           { 
             MakeUISafeCall(this, () => { TxtCounter1.Text = i.ToString(); });
           }
        }).Start();
    }

Let me spend some word on the MakeUISafeCall function…

The function accepts two parameters:

  • form (of type Form): is the form which is the target of the operation
  • act (of type Action): is the code to execute, you can pass it a lambda function

The function checks the value of the property InvokeRequired of the form. If the property returns true, then the action is executed using form.Invoke which manipulates the controls of the form in a thread safe way. Otherwise, the lambda function is executed by calling the Invoke method of the action.

That’s it…

C#, Threading, Windows Forms

Post navigation

Previous Post: Quickly open the startup folder in Windows 10
Next Post: Working with C# async / await keywords (part 1 of 3)

Related Posts

Push notifications library with C# and .NET Framework C#
Capture screen using C# C#
Working with C# async / await keywords (part 1 of 3) C#
System.Net.Sockets.SocketException (0x80004005): No such host is known ASP.NET
A chat program built in C# with .NET socket library C#
Is Environment.TickCount reliable? C#

Search

Subscribe to our newsletter

Related posts

  • What's my user agent
  • Error message: User account restriction error
  • Upgrading from Windows 10 Home to Windows 10 Pro
  • Encrypt a Windows drive with Bitlocker

Categories

  • .NET 6 (1)
  • AJAX (1)
  • Android (2)
  • Apache (4)
  • ASP.NET (9)
  • ASP.NET MVC (3)
  • Avalonia UI (1)
  • BCP (1)
  • Bitlocker (2)
  • C# (14)
  • CentOS (4)
  • ClosedXML (1)
  • CLR (1)
  • DNS (1)
  • Encryption (3)
  • Excel (2)
  • FuelPHP (3)
  • Google Chrome (1)
  • GSuite (1)
  • HTML (1)
  • Imagick (2)
  • Javascript (1)
  • Kindle (1)
  • LAMP (3)
  • Linux (6)
  • MariaDB (2)
  • Mathematics (2)
  • MySql (4)
  • NPOI (1)
  • Office 365 (1)
  • Perl (1)
  • PHP (6)
  • Programming (1)
  • Remote desktop (1)
  • SFTP (2)
  • Sockets (3)
  • Sql Server (18)
  • Sql Server 2016 (14)
  • Sql Server 2019 (1)
  • SSL (2)
  • Task scheduler (1)
  • Telerik ASP.NET AJAX (2)
  • The Dummy Programmer Chat (2)
  • The Dummy Programmer Robot (6)
  • Threading (5)
  • Tools (1)
  • TPL (3)
  • TypeScript (3)
  • Ubuntu (4)
  • Virtualization software (3)
  • Visual Studio (1)
  • Visual Studio Code (2)
  • Web fonts (1)
  • Web programming (6)
  • Windows (12)
  • Windows 10 (15)
  • Windows Forms (1)
  • Windows Server (5)

Copyright © 2022 The Dummy Programmer | Privacy Policy |

Powered by PressBook Masonry Dark