Skip to content

The Dummy Programmer

Stories of daily programming

  • Home
  • My other dummy projects
  • Games
    • Space Y: An Asteroids clone
  • Services
    • What’s my user agent
    • What’s my IP address
  • 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

C# async / await behind the scenes C#
Capture screen using C# C#
Is Environment.TickCount reliable? C#
Working with C# async / await keywords (part 2 of 3) C#
Reading data from a NetworkStream object in C# C#
Telerik RadGrid’s pagination hangs ASP.NET

Search

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)
  • .NET 7 (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)
  • Games (2)
  • Google Chrome (1)
  • GSuite (1)
  • HTML (1)
  • Imagick (2)
  • Javascript (1)
  • Kindle (1)
  • LAMP (3)
  • Linux (7)
  • 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 (20)
  • Sql Server 2016 (14)
  • Sql Server 2019 (1)
  • SSL (4)
  • Task scheduler (1)
  • Telerik ASP.NET AJAX (2)
  • The Dummy Programmer Chat (2)
  • Threading (5)
  • Tools (1)
  • TPL (3)
  • TypeScript (3)
  • Ubuntu (4)
  • Virtualization software (3)
  • Visual Studio (1)
  • Visual Studio Code (2)
  • VueJS (1)
  • Web fonts (1)
  • Web programming (6)
  • Windows (12)
  • Windows 10 (15)
  • Windows Forms (1)
  • Windows Server (6)

Copyright © 2024 The Dummy Programmer | Privacy Policy | Terms of use |

Powered by PressBook Masonry Dark

Manage Cookie Consent
This site doesn’t collect user personal data and doesn’t install profiling or analytical cookies, either its own or from third parties. Read our privacy policy for more info.
Functional Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
Manage options Manage services Manage {vendor_count} vendors Read more about these purposes
View preferences
{title} {title} {title}