From d30fae457c1ac76c71912e6bb013d7e45a1a0fd9 Mon Sep 17 00:00:00 2001 From: "Andy (Steve) De George" <67293991+adegeo@users.noreply.github.com> Date: Mon, 26 Jul 2021 15:14:58 -0700 Subject: [PATCH] Add how-to-make-thread-safe-calls.md & Update Layout with margin/padding (#1119) * Update with margin/padding * add how-to-make-thread-safe-calls * reverse property mentions --- .openpublishing.redirection.json | 15 +++- .../controls/how-to-add-an-event-handler.md | 4 +- .../controls/how-to-make-thread-safe-calls.md | 64 ++++++++++++++ .../net/winforms/controls/layout.md | 18 +++- .../controls/media/layout/margin-padding.pdn | Bin 0 -> 21486 bytes .../controls/media/layout/margin-padding.png | Bin 0 -> 2336 bytes .../controls/media/layout/margins.gif | Bin 0 -> 150233 bytes .../net/winforms/controls/overview.md | 23 +++-- .../cs/Form1.Designer.cs | 73 ++++++++++++++++ .../how-to-make-thread-safe-calls/cs/Form1.cs | 48 +++++++++++ .../cs/Form1.resx | 60 +++++++++++++ .../cs/FormBackgroundWorker.Designer.cs | 80 ++++++++++++++++++ .../cs/FormBackgroundWorker.cs | 44 ++++++++++ .../cs/FormBackgroundWorker.resx | 63 ++++++++++++++ .../cs/FormBad.Designer.cs | 72 ++++++++++++++++ .../cs/FormBad.cs | 31 +++++++ .../cs/FormBad.resx | 60 +++++++++++++ .../cs/FormThread.Designer.cs | 73 ++++++++++++++++ .../cs/FormThread.cs | 50 +++++++++++ .../cs/FormThread.resx | 60 +++++++++++++ .../cs/Program.cs | 23 +++++ .../cs/project.csproj | 9 ++ .../vb/FormBackgroundWorker.Designer.vb | 67 +++++++++++++++ .../vb/FormBackgroundWorker.resx | 63 ++++++++++++++ .../vb/FormBackgroundWorker.vb | 31 +++++++ .../vb/FormBad.Designer.vb | 61 +++++++++++++ .../vb/FormBad.resx | 60 +++++++++++++ .../vb/FormBad.vb | 12 +++ .../vb/FormThread.Designer.vb | 61 +++++++++++++ .../vb/FormThread.resx | 60 +++++++++++++ .../vb/FormThread.vb | 28 ++++++ .../vb/Program.vb | 15 ++++ .../vb/project.vbproj | 10 +++ dotnet-desktop-guide/net/winforms/toc.yml | 2 + redirects_generator/definitions.json | 10 +++ 35 files changed, 1341 insertions(+), 9 deletions(-) create mode 100644 dotnet-desktop-guide/net/winforms/controls/how-to-make-thread-safe-calls.md create mode 100644 dotnet-desktop-guide/net/winforms/controls/media/layout/margin-padding.pdn create mode 100644 dotnet-desktop-guide/net/winforms/controls/media/layout/margin-padding.png create mode 100644 dotnet-desktop-guide/net/winforms/controls/media/layout/margins.gif create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Form1.Designer.cs create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Form1.cs create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Form1.resx create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.Designer.cs create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.cs create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.resx create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBad.Designer.cs create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBad.cs create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBad.resx create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormThread.Designer.cs create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormThread.cs create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormThread.resx create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Program.cs create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/project.csproj create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.Designer.vb create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.resx create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.vb create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBad.Designer.vb create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBad.resx create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBad.vb create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormThread.Designer.vb create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormThread.resx create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormThread.vb create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/Program.vb create mode 100644 dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/project.vbproj diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index a3c9f85..ea2f215 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -294,7 +294,8 @@ }, { "source_path": "dotnet-desktop-guide/net/wpf/data/data-binding-overview.md", - "redirect_url": "/dotnet/desktop/wpf/data/index?view=netdesktop-5.0" + "redirect_url": "/dotnet/desktop/wpf/data/index?view=netdesktop-5.0", + "redirect_document_id": true }, { "source_path": "dotnet-desktop-guide/net/wpf/advanced/xaml-in-wpf.md", @@ -435,6 +436,18 @@ { "source_path": "dotnet-desktop-guide/net/winforms/how-to-connect-multiple-events-to-a-single-event-handler-in-windows-forms.md", "redirect_url": "/dotnet/desktop/winforms/controls/how-to-add-an-event-handler?view=netdesktop-5.0#how-to-use-multiple-events-with-the-same-handler" + }, + { + "source_path": "dotnet-desktop-guide/net/winforms/controls/margin-and-padding-in-windows-forms-controls.md", + "redirect_url": "/dotnet/desktop/winforms/controls/layout?view=netdesktop-5.0#margin-and-padding" + }, + { + "source_path": "dotnet-desktop-guide/net/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls.md", + "redirect_url": "/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls?view=netdesktop-5.0" + }, + { + "source_path": "dotnet-desktop-guide/framework/winforms/controls/how-to-make-thread-safe-calls.md", + "redirect_url": "/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls?view=netframeworkdesktop-4.8" } ] } diff --git a/dotnet-desktop-guide/net/winforms/controls/how-to-add-an-event-handler.md b/dotnet-desktop-guide/net/winforms/controls/how-to-add-an-event-handler.md index 1457d1a..fec3bed 100644 --- a/dotnet-desktop-guide/net/winforms/controls/how-to-add-an-event-handler.md +++ b/dotnet-desktop-guide/net/winforms/controls/how-to-add-an-event-handler.md @@ -1,6 +1,6 @@ --- title: How to add or remove an event handler -description: Learn how to create an event handler at design-time with the Windows Forms Designer in Visual Studio or at run-time. +description: Learn how to create an event handler for a control at design-time with the Windows Forms Designer in Visual Studio or at run-time. ms.date: 07/16/2021 dev_langs: - "csharp" @@ -18,7 +18,7 @@ helpviewer_keywords: - "menu items [Windows Forms], multicasting event-handling methods" --- -# How to handle an event (Windows Forms .NET) +# How to handle a control event (Windows Forms .NET) Events for controls (and for forms) are generally set through the Visual Studio Visual Designer for Windows Forms. Setting an event through the Visual Designer is known as handling an event at design-time. You can also handle events dynamically in code, known as handling events at run-time. An event created at run-time allows you to connect event handlers dynamically based on what your app is currently doing. diff --git a/dotnet-desktop-guide/net/winforms/controls/how-to-make-thread-safe-calls.md b/dotnet-desktop-guide/net/winforms/controls/how-to-make-thread-safe-calls.md new file mode 100644 index 0000000..9f242bd --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/how-to-make-thread-safe-calls.md @@ -0,0 +1,64 @@ +--- +title: How to make thread-safe calls to controls +description: Learn how to implement multithreading in your app by calling cross-thread controls in a thread-safe way. If you encounter the 'cross-thread operation not valid' error, use the InvokeRequired property to detect this error. The BackgroundWorker component is also an alternative to creating new threads. +ms.date: 06/20/2021 +dev_langs: + - "csharp" + - "vb" +f1_keywords: + - "EHInvalidOperation.WinForms.IllegalCrossThreadCall" +helpviewer_keywords: + - "thread safety [Windows Forms], calling controls [Windows Forms]" + - "calling controls [Windows Forms], thread safety [Windows Forms]" + - "CheckForIllegalCrossThreadCalls property [Windows Forms]" + - "Windows Forms controls [Windows Forms], multithreading" + - "BackgroundWorker class [Windows Forms], examples" + - "threading [Windows Forms], cross-thread calls" + - "controls [Windows Forms], multithreading" +--- + +# How to make thread-safe calls to controls (Windows Forms .NET) + +Multithreading can improve the performance of Windows Forms apps, but access to Windows Forms controls isn't inherently thread-safe. Multithreading can expose your code to serious and complex bugs. Two or more threads manipulating a control can force the control into an inconsistent state and lead to race conditions, deadlocks, and freezes or hangs. If you implement multithreading in your app, be sure to call cross-thread controls in a thread-safe way. For more information, see [Managed threading best practices](/dotnet/standard/threading/managed-threading-best-practices). + +[!INCLUDE [desktop guide under construction](../../includes/desktop-guide-preview-note.md)] + +There are two ways to safely call a Windows Forms control from a thread that didn't create that control. Use the method to call a delegate created in the main thread, which in turn calls the control. Or, implement a , which uses an event-driven model to separate work done in the background thread from reporting on the results. + +## Unsafe cross-thread calls + +It's unsafe to call a control directly from a thread that didn't create it. The following code snippet illustrates an unsafe call to the control. The `Button1_Click` event handler creates a new `WriteTextUnsafe` thread, which sets the main thread's property directly. + +:::code language="csharp" source="snippets/how-to-make-thread-safe-calls/cs/FormBad.cs" id="Bad"::: +:::code language="vb" source="snippets/how-to-make-thread-safe-calls/vb/FormBad.vb" id="Bad"::: + +The Visual Studio debugger detects these unsafe thread calls by raising an with the message, **Cross-thread operation not valid. Control accessed from a thread other than the thread it was created on.** The always occurs for unsafe cross-thread calls during Visual Studio debugging, and may occur at app runtime. You should fix the issue, but you can disable the exception by setting the property to `false`. + +## Safe cross-thread calls + +The following code examples demonstrate two ways to safely call a Windows Forms control from a thread that didn't create it: + +1. The method, which calls a delegate from the main thread to call the control. +2. A component, which offers an event-driven model. + +In both examples, the background thread sleeps for one second to simulate work being done in that thread. + +## Example: Use the Invoke method + +The following example demonstrates a pattern for ensuring thread-safe calls to a Windows Forms control. It queries the property, which compares the control's creating thread ID to the calling thread ID. If they're different, you should call the method. + +The `WriteTextSafe` enables setting the control's property to a new value. The method queries . If returns `true`, `WriteTextSafe` recursively calls itself, passing the method as a delegate to the method. If returns `false`, `WriteTextSafe` sets the directly. The `Button1_Click` event handler creates the new thread and runs the `WriteTextSafe` method. + +:::code language="csharp" source="snippets/how-to-make-thread-safe-calls/cs/FormThread.cs" id="Good"::: +:::code language="vb" source="snippets/how-to-make-thread-safe-calls/vb/FormThread.vb" id="Good"::: + +## Example: Use a BackgroundWorker + +An easy way to implement multithreading is with the component, which uses an event-driven model. The background thread raises the event, which doesn't interact with the main thread. The main thread runs the and event handlers, which can call the main thread's controls. + +To make a thread-safe call by using , handle the event. There are two events the background worker uses to report status: and . The `ProgressChanged` event is used to communicate status updates to the main thread, and the `RunWorkerCompleted` event is used to signal that the background worker has completed its work. To start the background thread, call . + +The example counts from 0 to 10 in the `DoWork` event, pausing for one second between counts. It uses the event handler to report the number back to the main thread and set the control's property. For the event to work, the property must be set to `true`. + +:::code language="csharp" source="snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.cs" id="Background"::: +:::code language="vb" source="snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.vb" id="Background"::: diff --git a/dotnet-desktop-guide/net/winforms/controls/layout.md b/dotnet-desktop-guide/net/winforms/controls/layout.md index bc949db..c115399 100644 --- a/dotnet-desktop-guide/net/winforms/controls/layout.md +++ b/dotnet-desktop-guide/net/winforms/controls/layout.md @@ -1,7 +1,7 @@ --- title: Control layout options description: Learn about the different settings on a control that affect layout and positioning in Windows Forms for .NET. Learn about the different types of control containers that affect layout. -ms.date: 10/26/2020 +ms.date: 07/19/2021 ms.topic: overview helpviewer_keywords: - "forms [Windows Forms], aligning controls" @@ -36,6 +36,22 @@ When a control is added to a parent that enforces automatic placement, the posit The and properties help set the minimum and maximum space a control can use. +## Margin and Padding + +There are two control properties that help with precise placement of controls: and . + +The property defines the space around the control that keeps other controls a specified distance from the control's borders. + +The property defines the space in the interior of a control that keeps the control's content (for example, the value of its property) a specified distance from the control's borders. + +The following figure shows the and properties on a control. + +:::image type="content" source="media/layout/margin-padding.png" alt-text="Padding and Margin properties for Windows Forms Controls"::: + +The Visual Studio Designer will respect these properties when you're positioning and resizing controls. Snaplines appear as guides to help you remain outside the specified margin of a control. For example, Visual Studio displays the snapline when you drag a control next to another control: + +:::image type="content" source="media/layout/margins.gif" alt-text="Animated image demonstrating the snaplines with margin properties for Windows Forms .NET in Visual Studio"::: + ## Automatic placement and size Controls can be automatically placed within their parent. Some parent containers force placement while others respect control settings that guide placement. There are two properties on a control that help automatic placement and size within a parent: and . diff --git a/dotnet-desktop-guide/net/winforms/controls/media/layout/margin-padding.pdn b/dotnet-desktop-guide/net/winforms/controls/media/layout/margin-padding.pdn new file mode 100644 index 0000000000000000000000000000000000000000..bf6618a9f0b165304dbf5855abe4ca82d21609d7 GIT binary patch literal 21486 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 cSDo;m?D%)m`=eE%GNLvp80=jPSM^hiR+L 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

cr=%uNr!0JP}bl0?)iW;mTkUEw3%qR`q(M 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

NK`%a=q&%%)Z~<7V*#cfCTFw~J~Xb$ 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%0D7G1o{ATDaip`=o47< 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 literal 0 HcmV?d00001 diff --git a/dotnet-desktop-guide/net/winforms/controls/overview.md b/dotnet-desktop-guide/net/winforms/controls/overview.md index 1fe1595..f1cc059 100644 --- a/dotnet-desktop-guide/net/winforms/controls/overview.md +++ b/dotnet-desktop-guide/net/winforms/controls/overview.md @@ -1,7 +1,7 @@ --- title: "Overview of Using Controls" description: Learn about how controls are used in Windows Forms for .NET. Controls are reusable components that provide functionality to the user. Many ready-to-use controls are provided. You can also make new controls. -ms.date: 10/26/2020 +ms.date: 07/21/2021 ms.topic: overview dev_langs: - "csharp" @@ -27,15 +27,28 @@ The position a control appears on a parent is determined by the value of the +Controls provide a set of common events through the base class: . Not every control responds to every event. For example, the control doesn't respond to keyboard input, so the event isn't raised. Most shared events fall under these categories: + +- Mouse events +- Keyboard events +- Property changed events +- Other events + +For more information, see [Control events](events.md) and [How to handle a control event](how-to-add-an-event-handler.md). + +## Control accessibility + +Windows Forms has accessibility support for screen readers and voice input utilities for verbal commands. However, you must design your UI with accessibility in mind. Windows Forms controls expose various properties to handle accessibility. For more information about these properties, see [Providing Accessibility Information for Controls](provide-accessibility-information.md). ## See also - [Position and layout of controls](layout.md) - [Label control overview](labels.md) -- [Add a control to a form](how-to-add-to-a-form.md) +- [Control events](events.md) +- [Types of custom controls](custom.md) +- [Painting and drawing on controls](custom-painting-drawing.md) +- [Providing Accessibility Information for Controls](provide-accessibility-information.md) diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Form1.Designer.cs b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Form1.Designer.cs new file mode 100644 index 0000000..48a1b18 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Form1.Designer.cs @@ -0,0 +1,73 @@ +namespace project +{ + partial class Form1 + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(46, 133); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(30, 37); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(333, 23); + this.textBox1.TabIndex = 1; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.button1); + this.Name = "Form1"; + this.Text = "Form1"; + this.Load += new System.EventHandler(this.Form1_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.TextBox textBox1; + } +} + diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Form1.cs b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Form1.cs new file mode 100644 index 0000000..27de7e3 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Form1.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace project +{ + public partial class Form1 : Form + { + public Form1() + { + InitializeComponent(); + } + + private void Form1_Load(object sender, EventArgs e) + { + + } + + private async void button1_Click(object sender, EventArgs e) + { + //var thread2 = new Thread(new ThreadStart(WriteTextUnsafe)); + //thread2.Start(); + await Task.Factory.StartNew(WriteTextUnsafe, new CancellationToken(false), TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); + await Task.Delay(6000); + Action de = delegate { WriteTextSafe(); }; + textBox1.Invoke(de); + } + + private async void WriteTextUnsafe() + { + textBox1.Text = "This text was set unsafely."; + await Task.Delay(4000); + textBox1.Text = "This text was set unsafely twice!"; + } + + private void WriteTextSafe() + { + textBox1.Text = "This text was set safely."; + } + } +} diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Form1.resx b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Form1.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Form1.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.Designer.cs b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.Designer.cs new file mode 100644 index 0000000..aecb7f4 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.Designer.cs @@ -0,0 +1,80 @@ + +namespace project +{ + partial class FormBackgroundWorker + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(24, 135); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(24, 106); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(236, 23); + this.textBox1.TabIndex = 1; + // + // backgroundWorker1 + // + this.backgroundWorker1.WorkerReportsProgress = true; + this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork); + this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged); + // + // FormBackgroundWorker + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.button1); + this.Name = "FormBackgroundWorker"; + this.Text = "FormBackgroundWorker"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.TextBox textBox1; + private System.ComponentModel.BackgroundWorker backgroundWorker1; + } +} \ No newline at end of file diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.cs b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.cs new file mode 100644 index 0000000..8480bf8 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace project +{ + public partial class FormBackgroundWorker : Form + { + public FormBackgroundWorker() + { + InitializeComponent(); + } + + // + private void button1_Click(object sender, EventArgs e) + { + if (!backgroundWorker1.IsBusy) + backgroundWorker1.RunWorkerAsync(); + } + + private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) + { + int counter = 0; + int max = 10; + + while (counter <= max) + { + backgroundWorker1.ReportProgress(0, counter.ToString()); + System.Threading.Thread.Sleep(1000); + counter++; + } + } + + private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) => + textBox1.Text = (string)e.UserState; + // + } +} diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.resx b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.resx new file mode 100644 index 0000000..8453790 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBackgroundWorker.resx @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBad.Designer.cs b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBad.Designer.cs new file mode 100644 index 0000000..9fbf81a --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBad.Designer.cs @@ -0,0 +1,72 @@ + +namespace project +{ + partial class FormBad + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(57, 165); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(57, 136); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(217, 23); + this.textBox1.TabIndex = 1; + // + // FormBad + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.button1); + this.Name = "FormBad"; + this.Text = "FormBad"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.TextBox textBox1; + } +} \ No newline at end of file diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBad.cs b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBad.cs new file mode 100644 index 0000000..9a854be --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBad.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace project +{ + public partial class FormBad : Form + { + public FormBad() + { + InitializeComponent(); + } + + // + private void button1_Click(object sender, EventArgs e) + { + var thread2 = new System.Threading.Thread(WriteTextUnsafe); + thread2.Start(); + } + + private void WriteTextUnsafe() => + textBox1.Text = "This text was set unsafely."; + // + } +} diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBad.resx b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBad.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormBad.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormThread.Designer.cs b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormThread.Designer.cs new file mode 100644 index 0000000..a3f5ee9 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormThread.Designer.cs @@ -0,0 +1,73 @@ + +namespace project +{ + partial class FormThread + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.button1 = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // button1 + // + this.button1.Location = new System.Drawing.Point(21, 84); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 0; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(21, 55); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(267, 23); + this.textBox1.TabIndex = 1; + this.textBox1.Enter += new System.EventHandler(this.textBox1_Enter); + // + // FormThread + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.button1); + this.Name = "FormThread"; + this.Text = "FormThread"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button button1; + private System.Windows.Forms.TextBox textBox1; + } +} \ No newline at end of file diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormThread.cs b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormThread.cs new file mode 100644 index 0000000..bdde2ac --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormThread.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace project +{ + public partial class FormThread : Form + { + public FormThread() + { + InitializeComponent(); + } + + // + private void button1_Click(object sender, EventArgs e) + { + var threadParameters = new System.Threading.ThreadStart(delegate { WriteTextSafe("This text was set safely."); }); + var thread2 = new System.Threading.Thread(threadParameters); + thread2.Start(); + } + + public void WriteTextSafe(string text) + { + if (textBox1.InvokeRequired) + { + // Call this same method but append THREAD2 to the text + Action safeWrite = delegate { WriteTextSafe($"{text} (THREAD2)"); }; + textBox1.Invoke(safeWrite); + } + else + textBox1.Text = text; + } + // + + private void textBox1_Enter(object sender, System.EventArgs e) + { + //if (!String.IsNullOrEmpty(textBox1.Text)) + //{ + // textBox1.SelectionStart = 0; + // textBox1.SelectionLength = textBox1.Text.Length; + //} + } + } +} diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormThread.resx b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormThread.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/FormThread.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Program.cs b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Program.cs new file mode 100644 index 0000000..745b078 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/Program.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace project +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.SetHighDpiMode(HighDpiMode.SystemAware); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FormBackgroundWorker()); + } + } +} diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/project.csproj b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/project.csproj new file mode 100644 index 0000000..a2d4310 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/cs/project.csproj @@ -0,0 +1,9 @@ + + + + WinExe + net5.0-windows + true + + + \ No newline at end of file diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.Designer.vb b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.Designer.vb new file mode 100644 index 0000000..df721f1 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.Designer.vb @@ -0,0 +1,67 @@ + _ +Partial Class FormBackgroundWorker + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Me.Button1 = New System.Windows.Forms.Button() + Me.TextBox1 = New System.Windows.Forms.TextBox() + Me.BackgroundWorker1 = New System.ComponentModel.BackgroundWorker() + Me.SuspendLayout() + ' + 'Button1 + ' + Me.Button1.Location = New System.Drawing.Point(28, 81) + Me.Button1.Name = "Button1" + Me.Button1.Size = New System.Drawing.Size(75, 23) + Me.Button1.TabIndex = 0 + Me.Button1.Text = "Button1" + Me.Button1.UseVisualStyleBackColor = True + ' + 'TextBox1 + ' + Me.TextBox1.Location = New System.Drawing.Point(28, 52) + Me.TextBox1.Name = "TextBox1" + Me.TextBox1.Size = New System.Drawing.Size(312, 23) + Me.TextBox1.TabIndex = 1 + ' + 'BackgroundWorker1 + ' + Me.BackgroundWorker1.WorkerReportsProgress = True + ' + 'FormBackgroundWorker + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 15.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(800, 450) + Me.Controls.Add(Me.TextBox1) + Me.Controls.Add(Me.Button1) + Me.Name = "FormBackgroundWorker" + Me.Text = "FormBackgroundWorker" + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Friend WithEvents Button1 As Windows.Forms.Button + Friend WithEvents TextBox1 As Windows.Forms.TextBox + Friend WithEvents BackgroundWorker1 As ComponentModel.BackgroundWorker +End Class diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.resx b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.resx new file mode 100644 index 0000000..3ae49ea --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.resx @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.vb b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.vb new file mode 100644 index 0000000..dd19d32 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBackgroundWorker.vb @@ -0,0 +1,31 @@ +Public Class FormBackgroundWorker + ' + Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click + + If (Not BackgroundWorker1.IsBusy) Then + BackgroundWorker1.RunWorkerAsync() + End If + + End Sub + + Private Sub BackgroundWorker1_DoWork(sender As Object, e As ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork + + Dim counter = 0 + Dim max = 10 + + While counter <= max + + BackgroundWorker1.ReportProgress(0, counter.ToString()) + System.Threading.Thread.Sleep(1000) + + counter += 1 + + End While + + End Sub + + Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged + TextBox1.Text = e.UserState + End Sub + ' +End Class diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBad.Designer.vb b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBad.Designer.vb new file mode 100644 index 0000000..7ffc2b8 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBad.Designer.vb @@ -0,0 +1,61 @@ + _ +Partial Class FormBad + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Me.TextBox1 = New System.Windows.Forms.TextBox() + Me.Button1 = New System.Windows.Forms.Button() + Me.SuspendLayout() + ' + 'TextBox1 + ' + Me.TextBox1.Location = New System.Drawing.Point(25, 43) + Me.TextBox1.Name = "TextBox1" + Me.TextBox1.Size = New System.Drawing.Size(249, 23) + Me.TextBox1.TabIndex = 0 + ' + 'Button1 + ' + Me.Button1.Location = New System.Drawing.Point(25, 72) + Me.Button1.Name = "Button1" + Me.Button1.Size = New System.Drawing.Size(75, 23) + Me.Button1.TabIndex = 1 + Me.Button1.Text = "Button1" + Me.Button1.UseVisualStyleBackColor = True + ' + 'FormBad + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 15.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(800, 450) + Me.Controls.Add(Me.Button1) + Me.Controls.Add(Me.TextBox1) + Me.Name = "FormBad" + Me.Text = "FormBad" + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Friend WithEvents TextBox1 As Windows.Forms.TextBox + Friend WithEvents Button1 As Windows.Forms.Button +End Class diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBad.resx b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBad.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBad.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBad.vb b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBad.vb new file mode 100644 index 0000000..74bd714 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormBad.vb @@ -0,0 +1,12 @@ +Public Class FormBad + ' + Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click + Dim thread2 As New System.Threading.Thread(AddressOf WriteTextUnsafe) + thread2.Start() + End Sub + + Private Sub WriteTextUnsafe() + TextBox1.Text = "This text was set unsafely." + End Sub + ' +End Class diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormThread.Designer.vb b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormThread.Designer.vb new file mode 100644 index 0000000..a9c34f1 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormThread.Designer.vb @@ -0,0 +1,61 @@ + _ +Partial Class FormThread + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Me.Button1 = New System.Windows.Forms.Button() + Me.TextBox1 = New System.Windows.Forms.TextBox() + Me.SuspendLayout() + ' + 'Button1 + ' + Me.Button1.Location = New System.Drawing.Point(27, 82) + Me.Button1.Name = "Button1" + Me.Button1.Size = New System.Drawing.Size(75, 23) + Me.Button1.TabIndex = 0 + Me.Button1.Text = "Button1" + Me.Button1.UseVisualStyleBackColor = True + ' + 'TextBox1 + ' + Me.TextBox1.Location = New System.Drawing.Point(27, 53) + Me.TextBox1.Name = "TextBox1" + Me.TextBox1.Size = New System.Drawing.Size(235, 23) + Me.TextBox1.TabIndex = 1 + ' + 'FormThread + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 15.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(800, 450) + Me.Controls.Add(Me.TextBox1) + Me.Controls.Add(Me.Button1) + Me.Name = "FormThread" + Me.Text = "FormThread" + Me.ResumeLayout(False) + Me.PerformLayout() + + End Sub + + Friend WithEvents Button1 As Windows.Forms.Button + Friend WithEvents TextBox1 As Windows.Forms.TextBox +End Class diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormThread.resx b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormThread.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormThread.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormThread.vb b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormThread.vb new file mode 100644 index 0000000..f4588e8 --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/FormThread.vb @@ -0,0 +1,28 @@ +Public Class FormThread + ' + Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click + + Dim threadParameters As New System.Threading.ThreadStart(Sub() + WriteTextSafe("This text was set safely.") + End Sub) + + Dim thread2 As New System.Threading.Thread(threadParameters) + thread2.Start() + + End Sub + + Private Sub WriteTextSafe(text As String) + + If (TextBox1.InvokeRequired) Then + + TextBox1.Invoke(Sub() + WriteTextSafe($"{text} (THREAD2)") + End Sub) + + Else + TextBox1.Text = text + End If + + End Sub + ' +End Class diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/Program.vb b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/Program.vb new file mode 100644 index 0000000..5db4a1f --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/Program.vb @@ -0,0 +1,15 @@ +Imports System +Imports System.Collections.Generic +Imports System.Linq +Imports System.Threading.Tasks +Imports System.Windows.Forms + +Module Program + Sub Main(args As String()) + Application.SetHighDpiMode(HighDpiMode.SystemAware) + Application.EnableVisualStyles() + Application.SetCompatibleTextRenderingDefault(False) + Application.Run(New FormBackgroundWorker()) + End Sub + +End Module diff --git a/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/project.vbproj b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/project.vbproj new file mode 100644 index 0000000..b8f402e --- /dev/null +++ b/dotnet-desktop-guide/net/winforms/controls/snippets/how-to-make-thread-safe-calls/vb/project.vbproj @@ -0,0 +1,10 @@ + + + + WinExe + net5.0-windows + true + project.Program + + + \ No newline at end of file diff --git a/dotnet-desktop-guide/net/winforms/toc.yml b/dotnet-desktop-guide/net/winforms/toc.yml index f147bf5..fd24313 100644 --- a/dotnet-desktop-guide/net/winforms/toc.yml +++ b/dotnet-desktop-guide/net/winforms/toc.yml @@ -59,6 +59,8 @@ items: href: controls/how-to-add-a-picture-to-a-control.md - name: Add or remove event handlers href: controls/how-to-add-an-event-handler.md + - name: Make thread-safe calls to controls + href: controls/how-to-make-thread-safe-calls.md - name: User input - keyboard items: - name: Overview diff --git a/redirects_generator/definitions.json b/redirects_generator/definitions.json index 3d9588e..a3fe002 100644 --- a/redirects_generator/definitions.json +++ b/redirects_generator/definitions.json @@ -60,6 +60,11 @@ "SourceUrl": "/dotnet/desktop/winforms/controls/autosize-property-overview?view=netframeworkdesktop-4.8", "TargetUrl": "/dotnet/desktop/winforms/controls/layout?view=netdesktop-5.0#automatic-sizing" }, + { + "Redirect": "OneWay", + "SourceUrl": "/dotnet/desktop/winforms/controls/margin-and-padding-in-windows-forms-controls?view=netframeworkdesktop-4.8", + "TargetUrl": "/dotnet/desktop/winforms/controls/layout?view=netdesktop-5.0#margin-and-padding" + }, { "Redirect": "TwoWay", "SourceUrl": "/dotnet/desktop/winforms/controls/label-control-overview-windows-forms?view=netframeworkdesktop-4.8", @@ -90,6 +95,11 @@ "SourceUrl": "/dotnet/desktop/winforms/how-to-connect-multiple-events-to-a-single-event-handler-in-windows-forms?view=netframeworkdesktop-4.8", "TargetUrl": "/dotnet/desktop/winforms/controls/how-to-add-an-event-handler?view=netdesktop-5.0#how-to-use-multiple-events-with-the-same-handler" }, + { + "Redirect": "TwoWay", + "SourceUrl": "/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls?view=netframeworkdesktop-4.8", + "TargetUrl": "/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls?view=netdesktop-5.0" + }, // Custom controls {