From 3f93cbd2549aa52da0e07d3ebf970c3b775c7d92 Mon Sep 17 00:00:00 2001 From: "Andy De George (from Dev Box)" Date: Thu, 6 Aug 2026 13:22:54 -0700 Subject: [PATCH 1/2] Removed .NET framework versioning where appropriate --- docs/core/extensions/create-resource-files.md | 4 ++-- docs/core/extensions/httpclient-factory.md | 6 +++--- .../configure-apps/how-to-create-a-publisher-policy.md | 5 +---- .../adonet/connection-strings-and-configuration-files.md | 5 +++-- .../adonet/dataset-datatable-dataview/security-guidance.md | 2 +- .../data/adonet/sql/provider-statistics-for-sql-server.md | 2 +- ...ient-support-for-high-availability-disaster-recovery.md | 2 +- .../deployment/how-the-runtime-locates-assemblies.md | 2 +- .../initialization-errors-managing-the-user-experience.md | 2 +- docs/framework/performance/clr-etw-keywords-and-levels.md | 4 ++-- .../reflection-for-windows-store-apps.md | 2 +- docs/fundamentals/code-analysis/quality-rules/ca5370.md | 2 +- .../consuming-the-task-based-asynchronous-pattern.md | 6 +++--- .../event-based-asynchronous-pattern-eap.md | 2 +- .../implementing-the-task-based-asynchronous-pattern.md | 4 ++-- docs/standard/asynchronous-programming-patterns/index.md | 4 ++-- .../base-types/choosing-between-anonymous-and-tuple.md | 4 ++-- docs/standard/collections/sorted-collection-types.md | 2 +- docs/standard/garbage-collection/large-object-heap.md | 2 +- docs/standard/garbage-collection/performance.md | 4 ++-- docs/standard/generics.md | 2 +- docs/standard/io/asynchronous-file-i-o.md | 7 ++++--- docs/standard/mef/index.md | 4 ++-- .../importing-a-type-library-as-an-assembly.md | 2 +- .../type-equivalence-and-embedded-interop-types.md | 2 +- docs/standard/parallel-programming/index.md | 2 +- .../binaryformatter-migration-guide/choose-a-serializer.md | 2 +- docs/standard/threading/canceling-threads-cooperatively.md | 2 +- docs/standard/threading/cancellation-in-managed-threads.md | 2 +- docs/standard/threading/countdownevent.md | 2 +- docs/standard/threading/managed-threading-basics.md | 4 ++-- .../standard/threading/managed-threading-best-practices.md | 2 +- docs/standard/threading/threads-and-threading.md | 2 +- .../language-features/data-types/tuples.md | 2 +- 34 files changed, 51 insertions(+), 52 deletions(-) diff --git a/docs/core/extensions/create-resource-files.md b/docs/core/extensions/create-resource-files.md index 5e132bf3f2115..c7235a188a2b5 100644 --- a/docs/core/extensions/create-resource-files.md +++ b/docs/core/extensions/create-resource-files.md @@ -1,7 +1,7 @@ --- title: Create resource files description: Make resource files for .NET apps. Build text files with string resources, XML or binary files programmatically, or XML files with string, image, or object data. -ms.date: 10/20/2025 +ms.date: 08/06/2026 dev_langs: - "csharp" - "vb" @@ -73,7 +73,7 @@ HelpMenuName=Help EmptyString= ``` - Starting with .NET Framework 4.5 and in all versions of .NET Core, text files support conditional compilation with the `#ifdef`*symbol*... `#endif` and `#if !`*symbol*... `#endif` constructs. You can then use the `/define` switch with [Resource File Generator (_resgen.exe_)](../../framework/tools/resgen-exe-resource-file-generator.md) to define symbols. Each resource requires its own `#ifdef`*symbol*... `#endif` or `#if !`*symbol*... `#endif` construct. If you use an `#ifdef` statement and *symbol* is defined, the associated resource is included in the .resources file; otherwise, it is not included. If you use an `#if !` statement and *symbol* is not defined, the associated resource is included in the .resources file; otherwise, it is not included. + Text files support conditional compilation with the `#ifdef`*symbol*... `#endif` and `#if !`*symbol*... `#endif` constructs. You can then use the `/define` switch with [Resource File Generator (_resgen.exe_)](../../framework/tools/resgen-exe-resource-file-generator.md) to define symbols. Each resource requires its own `#ifdef`*symbol*... `#endif` or `#if !`*symbol*... `#endif` construct. If you use an `#ifdef` statement and *symbol* is defined, the associated resource is included in the .resources file; otherwise, it is not included. If you use an `#if !` statement and *symbol* is not defined, the associated resource is included in the .resources file; otherwise, it is not included. Comments are optional in text files and are preceded either by a semicolon (;) or by a pound sign (#) at the beginning of a line. Lines that contain comments can be placed anywhere in the file. Comments are not included in a compiled .resources file that is created by using [Resource File Generator (_resgen.exe_)](../../framework/tools/resgen-exe-resource-file-generator.md). diff --git a/docs/core/extensions/httpclient-factory.md b/docs/core/extensions/httpclient-factory.md index dcc85aa905138..676aa40a31621 100644 --- a/docs/core/extensions/httpclient-factory.md +++ b/docs/core/extensions/httpclient-factory.md @@ -1,14 +1,14 @@ --- title: Use the IHttpClientFactory description: Learn how to use the HttpClient and IHttpClientFactory implementations with dependency injection in your .NET workloads. -ms.date: 05/06/2025 +ms.date: 08/06/2026 --- # IHttpClientFactory with .NET -In this article, you'll learn how to use the `IHttpClientFactory` interface to create `HttpClient` types with various .NET fundamentals, such as dependency injection (DI), logging, and configuration. The type was introduced in .NET Framework 4.5, which was released in 2012. In other words, it's been around for a while. `HttpClient` is used for making HTTP requests and handling HTTP responses from web resources identified by a . The HTTP protocol makes up the vast majority of all internet traffic. +This article explains how to use the `IHttpClientFactory` interface to create `HttpClient` types with .NET fundamentals such as dependency injection (DI), logging, and configuration. makes HTTP requests and handles HTTP responses from web resources identified by a . The HTTP protocol makes up the vast majority of all internet traffic. -With modern application development principles driving best practices, the serves as a factory abstraction that can create `HttpClient` instances with custom configurations. was introduced in .NET Core 2.1. Common HTTP-based .NET workloads can take advantage of resilient and transient-fault-handling third-party middleware with ease. + is available in .NET, but not .NET Framework. It creates `HttpClient` instances with custom configurations and lets .NET workloads use resilient, transient-fault-handling third-party middleware. > [!WARNING] > If your app requires cookies, it's recommended to avoid using . Pooling the instances results in sharing of objects. Unanticipated sharing might leak cookies between unrelated parts of the application. Moreover, when expires, the handler is recycled, meaning that all cookies stored in its are lost. diff --git a/docs/framework/configure-apps/how-to-create-a-publisher-policy.md b/docs/framework/configure-apps/how-to-create-a-publisher-policy.md index 5908d5e0bbd4d..60f82903c1c44 100644 --- a/docs/framework/configure-apps/how-to-create-a-publisher-policy.md +++ b/docs/framework/configure-apps/how-to-create-a-publisher-policy.md @@ -68,10 +68,7 @@ In this command: - The `processorArchitecture` argument identifies the platform targeted by a processor-specific assembly. - > [!NOTE] - > The ability to target a specific processor architecture is available starting with .NET Framework 2.0. - -The ability to target a specific processor architecture is available starting with .NET Framework 2.0. The following command creates a publisher policy assembly called `policy.1.0.myAssembly` from a publisher policy file called `pub.config`, assigns a strong name to the assembly using the key pair in the `sgKey.snk` file, and specifies that the assembly targets the x86 processor architecture. +The following command creates a publisher policy assembly called `policy.1.0.myAssembly` from a publisher policy file called `pub.config`, assigns a strong name to the assembly using the key pair in the `sgKey.snk` file, and specifies that the assembly targets the x86 processor architecture. ```console al /link:pub.config /out:policy.1.0.myAssembly.dll /keyfile:sgKey.snk /platform:x86 diff --git a/docs/framework/data/adonet/connection-strings-and-configuration-files.md b/docs/framework/data/adonet/connection-strings-and-configuration-files.md index 88b420bb1150a..b54a6e8da581d 100644 --- a/docs/framework/data/adonet/connection-strings-and-configuration-files.md +++ b/docs/framework/data/adonet/connection-strings-and-configuration-files.md @@ -2,6 +2,7 @@ title: "Connection Strings and Configuration Files" description: Learn how to store connection strings for ADO.NET applications in an application configuration file. ms.date: "03/30/2017" +ai-usage: ai-assisted dev_langs: - "csharp" - "vb" @@ -63,14 +64,14 @@ Embedding connection strings in your application's code can lead to security vul ## Retrieve Connection Strings at Run Time -.NET Framework 2.0 introduced new classes in the namespace to simplify retrieving connection strings from configuration files at runtime. You can programmatically retrieve a connection string by name or by provider name. +Use classes in the namespace to retrieve connection strings from configuration files at runtime, by name or provider name. > [!NOTE] > The **machine.config** file also contains a `connectionStrings` section, which contains connection strings used by Visual Studio. When retrieving connection strings by provider name from the **app.config** file in a Windows application, the connection strings in **machine.config** get loaded first, and then the entries from **app.config**. Adding `clear` immediately after the `connectionStrings` element removes all inherited references from the data structure in memory, so that only the connection strings defined in the local **app.config** file are considered. ### Work with the Configuration Classes - Starting with .NET Framework 2.0, is used when working with configuration files on the local computer, replacing the deprecated class. is used to work with ASP.NET configuration files. It is designed to work with configuration files on a Web server, and allows programmatic access to configuration file sections such as **system.web**. +Use to work with configuration files on the local computer. It replaces the deprecated class. Use to work with ASP.NET configuration files. It works with configuration files on a web server and provides programmatic access to configuration file sections such as **system.web**. > [!NOTE] > Accessing configuration files at runtime requires granting permissions to the caller; the required permissions depend on the type of application, configuration file, and location. For more information, see for ASP.NET applications, and for Windows applications. diff --git a/docs/framework/data/adonet/dataset-datatable-dataview/security-guidance.md b/docs/framework/data/adonet/dataset-datatable-dataview/security-guidance.md index 800c94b97e3db..172138a3fdf63 100644 --- a/docs/framework/data/adonet/dataset-datatable-dataview/security-guidance.md +++ b/docs/framework/data/adonet/dataset-datatable-dataview/security-guidance.md @@ -13,7 +13,7 @@ This article applies to: * .NET Core and later * .NET 5 and later -The [DataSet](/dotnet/api/system.data.dataset) and [DataTable](/dotnet/api/system.data.datatable) types are legacy .NET components that allow representing data sets as managed objects. These components were introduced in .NET Framework 1.0 as part of the original [ADO.NET infrastructure](./index.md). Their goal was to provide a managed view over a relational data set, abstracting away whether the underlying source of the data was XML, SQL, or another technology. +The [DataSet](/dotnet/api/system.data.dataset) and [DataTable](/dotnet/api/system.data.datatable) types are legacy .NET components that allow representing data sets as managed objects. Their goal was to provide a managed view over a relational data set, abstracting away whether the underlying source of the data was XML, SQL, or another technology. For more information on ADO.NET, including more modern data view paradigms, see [the ADO.NET documentation](../index.md). diff --git a/docs/framework/data/adonet/sql/provider-statistics-for-sql-server.md b/docs/framework/data/adonet/sql/provider-statistics-for-sql-server.md index bbd42c276058b..ab110f1121855 100644 --- a/docs/framework/data/adonet/sql/provider-statistics-for-sql-server.md +++ b/docs/framework/data/adonet/sql/provider-statistics-for-sql-server.md @@ -8,7 +8,7 @@ dev_langs: --- # Provider statistics for SQL Server -Starting with .NET Framework version 2.0, the .NET Framework Data Provider for SQL Server supports runtime statistics. You must enable statistics by setting the property of the object to `True` after you have a valid connection object created. +The .NET Framework Data Provider for SQL Server supports runtime statistics. Enable statistics by setting the property on a valid object to `True`. After statistics are enabled, you can review them as a "snapshot in time" by retrieving an reference via the method of the object. You enumerate through the list as a set of name/value pair dictionary entries. These name/value pairs are unordered. At any time, you can call the method of the object to reset the counters. diff --git a/docs/framework/data/adonet/sql/sqlclient-support-for-high-availability-disaster-recovery.md b/docs/framework/data/adonet/sql/sqlclient-support-for-high-availability-disaster-recovery.md index 5e703c80f94f8..0b74e42cd1f87 100644 --- a/docs/framework/data/adonet/sql/sqlclient-support-for-high-availability-disaster-recovery.md +++ b/docs/framework/data/adonet/sql/sqlclient-support-for-high-availability-disaster-recovery.md @@ -6,7 +6,7 @@ ms.custom: sfi-ropc-nochange --- # SqlClient Support for high availability and disaster recovery -This article discusses SqlClient support (added in .NET Framework 4.5) for high availability and disaster recovery with the Always On features: Always On availability groups (AGs) and Always On failover cluster instances (FCIs) with SQL Server 2012 or later. +This article discusses SqlClient support for high availability and disaster recovery with the Always On features: Always On availability groups (AGs) and Always On failover cluster instances (FCIs) with SQL Server 2012 or later. You can now specify an availability group listener or the name of an FCI in the connection property. If a SqlClient application is connected to a database that fails over, the original connection is broken and the application must open a new connection to continue work after the failover. diff --git a/docs/framework/deployment/how-the-runtime-locates-assemblies.md b/docs/framework/deployment/how-the-runtime-locates-assemblies.md index fc775837ff4fd..77b3112f06884 100644 --- a/docs/framework/deployment/how-the-runtime-locates-assemblies.md +++ b/docs/framework/deployment/how-the-runtime-locates-assemblies.md @@ -146,7 +146,7 @@ Third, the runtime examines the machine configuration file. This file, called Ma If the requested assembly has also been requested in previous calls, the common language runtime uses the assembly that is already loaded. This can have ramifications when naming assemblies that make up an application. For more information about naming assemblies, see [Assembly Names](../../standard/assembly/names.md). -If a previous request for the assembly failed, subsequent requests for the assembly are failed immediately without attempting to load the assembly. Starting with .NET Framework version 2.0, assembly binding failures are cached, and the cached information is used to determine whether to attempt to load the assembly. +If a previous request for the assembly failed, subsequent requests for the assembly are failed immediately without attempting to load the assembly. Assembly binding failures are cached, and the cached information is used to determine whether to attempt to load the assembly. > [!NOTE] > To revert to the behavior of the .NET Framework versions 1.0 and 1.1, which did not cache binding failures, include the [`` Element](../configure-apps/file-schema/runtime/disablecachingbindingfailures-element.md) in your configuration file. diff --git a/docs/framework/deployment/initialization-errors-managing-the-user-experience.md b/docs/framework/deployment/initialization-errors-managing-the-user-experience.md index ff8963ef0e8d0..764800865eb77 100644 --- a/docs/framework/deployment/initialization-errors-managing-the-user-experience.md +++ b/docs/framework/deployment/initialization-errors-managing-the-user-experience.md @@ -80,7 +80,7 @@ The CLR activation system provides the same behavior and UI on Windows 8 as it d ![Dialog box for 3.5 install on Windows 8](./media/initialization-errors-managing-the-user-experience/install-framework-on-demand-dialog.png "Prompt for installing the .NET Framework 3.5 on demand") > [!NOTE] -> The .NET Framework 4.5 replaces the .NET Framework 4 (CLR 4) on the user's computer. Therefore, .NET Framework 4 applications run seamlessly, without displaying this dialog box, on Windows 8. +> The .NET Framework 4.5+ replaces the .NET Framework 4 (CLR 4) on the user's computer. Therefore, .NET Framework 4 applications run seamlessly, without displaying this dialog box, on Windows 8. When the .NET Framework 3.5 is installed, users can run applications that depend on .NET Framework 2.0, 3.0, or 3.5 on their Windows 8 computers. They can also run .NET Framework 1.0 and 1.1 applications, provided that those applications are not explicitly configured to run only on the .NET Framework 1.0 or 1.1. See [Migrating from the .NET Framework 1.1](../migration-guide/migrating-from-the-net-framework-1-1.md). diff --git a/docs/framework/performance/clr-etw-keywords-and-levels.md b/docs/framework/performance/clr-etw-keywords-and-levels.md index 21c94ab41e113..58c813e2cc71b 100644 --- a/docs/framework/performance/clr-etw-keywords-and-levels.md +++ b/docs/framework/performance/clr-etw-keywords-and-levels.md @@ -48,7 +48,7 @@ Event tracing for Windows (ETW) events can be filtered by category and level. Ev |`ContentionKeyword`|0x00004000|Enables the collection of [contention events](contention-etw-events.md).| |`ExceptionKeyword`|0x00008000|Enables the collection of [exception events](exception-thrown-v1-etw-event.md).| |`ThreadingKeyword`|0x00010000|Enables the collection of [thread pool events](thread-pool-etw-events.md).| -|`OverrideAndSuppressNGenEventsKeyword`|0x00040000|(Available in the .NET Framework 4.5 and later.) Suppresses the high-overhead `NGenKeyword` keyword and prevents the generation of events for methods that are inside NGen modules. Starting with .NET Framework 4.5, profiling tools should use `OverrideAndSuppressNGenEventsKeyword` and `NGenKeyword` together to suppress the generation of events for methods in NGen modules. This enables the profiling tool to use the more efficient NGen PDBs to get information about methods in NGen modules. The CLR in the .NET Framework 4 and earlier versions does not support the creation of NGen PDBs. In these earlier versions, the CLR will not recognize `OverrideAndSuppressNGenEventsKeyword` and will process `NGenKeyword` to generate events for methods in NGen modules.| +|`OverrideAndSuppressNGenEventsKeyword`|0x00040000|(Available in the .NET Framework 4.5 and later.) Suppresses the high-overhead `NGenKeyword` keyword and prevents the generation of events for methods that are inside NGen modules. Profiling tools should use `OverrideAndSuppressNGenEventsKeyword` and `NGenKeyword` together to suppress the generation of events for methods in NGen modules. This enables the profiling tool to use the more efficient NGen PDBs to get information about methods in NGen modules. The CLR in the .NET Framework 4 and earlier versions does not support the creation of NGen PDBs. In these earlier versions, the CLR will not recognize `OverrideAndSuppressNGenEventsKeyword` and will process `NGenKeyword` to generate events for methods in NGen modules.| |`PerfTrackKeyWord`|0x2000000|Enables the collection of the `ModuleLoad` and `ModuleRange` events.| |`StackKeyword`|0x40000000|Enables the collection of CLR [stack trace events](stack-etw-event.md).| @@ -67,7 +67,7 @@ Event tracing for Windows (ETW) events can be filtered by category and level. Ev |`EndRundownKeyword`|0x00000100|Enables the enumeration of system state during an end rundown.| |`AppDomainResourceManagementRundownKeyword`|0x00000800|Enables the collection of events for resource monitoring at an level when used with `StartRundownKeyword` or `EndRundownKeyword`.| |`ThreadingKeyword`|0x00010000|Enables the collection of thread pool events.| -|`OverrideAndSuppressNGenEventsRundownKeyword`|0x00040000|(Available in the .NET Framework 4.5 and later.) Suppresses the high-overhead `NGenRundownKeyword` keyword and prevents the generation of events for methods that are inside NGen modules. Starting with .NET Framework 4.5, profiling tools should use `OverrideAndSuppressNGenEventsRundownKeyword` and `NGenRundownKeyword` together to suppress the generation of events for methods in NGen modules. This enables the profiling tool to use the more efficient NGen PDBs to get information about methods in NGen modules. The CLR in the .NET Framework 4 and earlier versions does not support the creation of NGen PDBs. In these earlier versions, the CLR will not recognize `OverrideAndSuppressNGenEventsRundownKeyword` and will process `NGenRundownKeyword` to generate events for methods in NGen modules.| +|`OverrideAndSuppressNGenEventsRundownKeyword`|0x00040000|(Available in the .NET Framework 4.5 and later.) Suppresses the high-overhead `NGenRundownKeyword` keyword and prevents the generation of events for methods that are inside NGen modules. Profiling tools should use `OverrideAndSuppressNGenEventsRundownKeyword` and `NGenRundownKeyword` together to suppress the generation of events for methods in NGen modules. This enables the profiling tool to use the more efficient NGen PDBs to get information about methods in NGen modules. The CLR in the .NET Framework 4 and earlier versions does not support the creation of NGen PDBs. In these earlier versions, the CLR will not recognize `OverrideAndSuppressNGenEventsRundownKeyword` and will process `NGenRundownKeyword` to generate events for methods in NGen modules.| |`PerfTrackKeyWord`|0x2000000|Enables the collection of the `ModuleDCStart`, `ModuleDCEnd`, `ModuleRangeDCStart`, and `ModuleRangeDCEnd` events.| diff --git a/docs/framework/reflection-and-codedom/reflection-for-windows-store-apps.md b/docs/framework/reflection-and-codedom/reflection-for-windows-store-apps.md index a993a24d9eb0c..a27efec5f2d05 100644 --- a/docs/framework/reflection-and-codedom/reflection-for-windows-store-apps.md +++ b/docs/framework/reflection-and-codedom/reflection-for-windows-store-apps.md @@ -12,7 +12,7 @@ ms.assetid: 0d07090c-9b47-4ecc-81d1-29d539603c9b --- # Reflection in the .NET Framework for Windows Store Apps -Starting with .NET Framework 4.5, the .NET Framework includes a set of reflection types and members for use in Windows 8.x Store apps. These types and members are available in the full .NET Framework as well as in the .NET for Windows Store apps. This document explains the major differences between these and their counterparts in the .NET Framework 4 and earlier versions. +.NET Framework includes a set of reflection types and members for use in Windows 8.x Store apps. These types and members are available in the full .NET Framework as well as in the .NET for Windows Store apps. This document explains the major differences between these and their counterparts in the .NET Framework 4 and earlier versions. If you are creating a Windows 8.x Store app, you must use the reflection types and members in the .NET for Windows 8.x Store apps. These types and members are also available, but not required, for use in desktop apps, so you can use the same code for both types of apps. diff --git a/docs/fundamentals/code-analysis/quality-rules/ca5370.md b/docs/fundamentals/code-analysis/quality-rules/ca5370.md index 547fd614a55ae..d02467e63c79e 100644 --- a/docs/fundamentals/code-analysis/quality-rules/ca5370.md +++ b/docs/fundamentals/code-analysis/quality-rules/ca5370.md @@ -31,7 +31,7 @@ Processing untrusted DTD and XML schemas may enable loading dangerous external r ## How to fix violations - Use `XmlValidatingReader(XmlReader)` with `ProhibitDtd` and `ProcessInlineSchema` properties set to `false`. -- Starting in .NET Framework 2.0, `XmlValidatingReader` is considered obsolete. You can instantiate a validating reader with . +- `XmlValidatingReader` is considered obsolete. You can instantiate a validating reader with . ## When to suppress warnings diff --git a/docs/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern.md b/docs/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern.md index de24bc77a3798..28319b9ded44f 100644 --- a/docs/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern.md +++ b/docs/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern.md @@ -1,7 +1,7 @@ --- title: "Consuming the Task-based Asynchronous Pattern" description: Learn to consume the Task-based Asynchronous Pattern (TAP) when working with asynchronous operations. -ms.date: "04/17/2026" +ms.date: 08/06/2026 helpviewer_keywords: - ".NET and TAP" - "asynchronous design patterns, .NET" @@ -15,7 +15,7 @@ When you use the Task-based Asynchronous Pattern (TAP) to work with asynchronous ## Suspending Execution with Await -You can use the [await](../../csharp/language-reference/operators/await.md) keyword in C# and the [Await Operator](../../visual-basic/language-reference/operators/await-operator.md) in Visual Basic to asynchronously await and objects. When you await a , the `await` expression is of type `void`. When you await a , the `await` expression is of type `TResult`. An `await` expression must occur inside the body of an asynchronous method. (These language features were introduced in .NET Framework 4.5.) +You can use the [await](../../csharp/language-reference/operators/await.md) keyword in C# and the [Await Operator](../../visual-basic/language-reference/operators/await-operator.md) in Visual Basic to asynchronously await and objects. When you await a , the `await` expression is of type `void`. When you await a , the `await` expression is of type `TResult`. An `await` expression must occur inside the body of an asynchronous method. Under the covers, the await functionality installs a callback on the task by using a continuation. This callback resumes the asynchronous method at the point of suspension. When the asynchronous method is resumed, if the awaited operation completed successfully and was a , its `TResult` is returned. If the or that was awaited ended in the state, an exception is thrown. If the or that was awaited ended in the state, the exception that caused it to fault is thrown. A `Task` can fault as a result of multiple exceptions, but only one of these exceptions is propagated. However, the property returns an exception that contains all the errors. @@ -58,7 +58,7 @@ Use when the continuation doe ## Canceling an asynchronous operation -Starting with .NET Framework 4, TAP methods that support cancellation provide at least one overload that accepts a cancellation token ( object). +TAP methods that support cancellation provide at least one overload that accepts a cancellation token ( object). You create a cancellation token through a cancellation token source ( object). The source's property returns the cancellation token that signals when the source's method is called. diff --git a/docs/standard/asynchronous-programming-patterns/event-based-asynchronous-pattern-eap.md b/docs/standard/asynchronous-programming-patterns/event-based-asynchronous-pattern-eap.md index e7da7a0326e3c..10470818ac796 100644 --- a/docs/standard/asynchronous-programming-patterns/event-based-asynchronous-pattern-eap.md +++ b/docs/standard/asynchronous-programming-patterns/event-based-asynchronous-pattern-eap.md @@ -13,7 +13,7 @@ ms.assetid: c6baed9f-2a25-4728-9a9a-53b7b14840cf There are a number of ways to expose asynchronous features to client code. The Event-based Asynchronous Pattern prescribes one way for classes to present asynchronous behavior. > [!NOTE] -> Starting with .NET Framework 4, the Task Parallel Library provides a new model for asynchronous and parallel programming. For more information, see [Task Parallel Library (TPL)](../parallel-programming/task-parallel-library-tpl.md) and [Task-based Asynchronous Pattern (TAP)](task-based-asynchronous-pattern-tap.md). +> The Task Parallel Library provides a new model for asynchronous and parallel programming. For more information, see [Task Parallel Library (TPL)](../parallel-programming/task-parallel-library-tpl.md) and [Task-based Asynchronous Pattern (TAP)](task-based-asynchronous-pattern-tap.md). ## In This Section diff --git a/docs/standard/asynchronous-programming-patterns/implementing-the-task-based-asynchronous-pattern.md b/docs/standard/asynchronous-programming-patterns/implementing-the-task-based-asynchronous-pattern.md index 37f84755ddc3d..e9a7387c83271 100644 --- a/docs/standard/asynchronous-programming-patterns/implementing-the-task-based-asynchronous-pattern.md +++ b/docs/standard/asynchronous-programming-patterns/implementing-the-task-based-asynchronous-pattern.md @@ -1,7 +1,7 @@ --- title: "Implementing the Task-based Asynchronous Pattern" description: This article explains how to implement the Task-based Asynchronous Pattern. You can use it to implement compute-bound and I/O-bound asynchronous operations. -ms.date: "04/17/2026" +ms.date: 08/06/2026 dev_langs: - "csharp" - "vb" @@ -19,7 +19,7 @@ You can implement the task-based asynchronous pattern (TAP) in three ways: by us ### Using the compilers -Starting with .NET Framework 4.5, any method that is attributed with the `async` keyword (`Async` in Visual Basic) is considered an asynchronous method. The C# and Visual Basic compilers perform the necessary transformations to implement the method asynchronously by using TAP. An asynchronous method should return either a or a object. For the latter, the body of the function should return a `TResult`, and the compiler ensures that this result is made available through the resulting task object. Similarly, any exceptions that go unhandled within the body of the method are marshalled to the output task and cause the resulting task to end in the state. The exception to this rule is when an (or derived type) goes unhandled, in which case the resulting task ends in the state. +Any method that is attributed with the `async` keyword (`Async` in Visual Basic) is considered an asynchronous method. The C# and Visual Basic compilers perform the necessary transformations to implement the method asynchronously by using TAP. An asynchronous method should return either a or a object. For the latter, the body of the function should return a `TResult`, and the compiler ensures that this result is made available through the resulting task object. Similarly, any exceptions that go unhandled within the body of the method are marshalled to the output task and cause the resulting task to end in the state. The exception to this rule is when an (or derived type) goes unhandled, in which case the resulting task ends in the state. ### Task.Start and task disposal diff --git a/docs/standard/asynchronous-programming-patterns/index.md b/docs/standard/asynchronous-programming-patterns/index.md index 95902bc5c83fa..9cd554e3d8aa5 100644 --- a/docs/standard/asynchronous-programming-patterns/index.md +++ b/docs/standard/asynchronous-programming-patterns/index.md @@ -11,9 +11,9 @@ ms.assetid: 4ece5c0b-f8fe-4114-9862-ac02cfe5a5d7 .NET provides three patterns for performing asynchronous operations: -- **Task-based Asynchronous Pattern (TAP)**, which uses a single method to represent the initiation and completion of an asynchronous operation. TAP was introduced in .NET Framework 4. **It's the recommended approach to asynchronous programming in .NET.** The [async](../../csharp/language-reference/keywords/async.md) and [await](../../csharp/language-reference/operators/await.md) keywords in C# and the [Async](../../visual-basic/language-reference/modifiers/async.md) and [Await](../../visual-basic/language-reference/operators/await-operator.md) operators in Visual Basic add language support for TAP. For more information, see [Task-based Asynchronous Pattern (TAP)](task-based-asynchronous-pattern-tap.md). +- **Task-based Asynchronous Pattern (TAP)**, which uses a single method to represent the initiation and completion of an asynchronous operation. **It's the recommended approach to asynchronous programming in .NET.** The [async](../../csharp/language-reference/keywords/async.md) and [await](../../csharp/language-reference/operators/await.md) keywords in C# and the [Async](../../visual-basic/language-reference/modifiers/async.md) and [Await](../../visual-basic/language-reference/operators/await-operator.md) operators in Visual Basic add language support for TAP. For more information, see [Task-based Asynchronous Pattern (TAP)](task-based-asynchronous-pattern-tap.md). -- **Event-based Asynchronous Pattern (EAP)**, which is the event-based legacy model for providing asynchronous behavior. It requires a method that has the `Async` suffix and one or more events, event handler delegate types, and `EventArg`-derived types. EAP was introduced in .NET Framework 2.0. It's no longer recommended for new development. For more information, see [Event-based Asynchronous Pattern (EAP)](event-based-asynchronous-pattern-eap.md). +- **Event-based Asynchronous Pattern (EAP)**, which is the event-based legacy model for providing asynchronous behavior. It requires a method that has the `Async` suffix and one or more events, event handler delegate types, and `EventArg`-derived types. It's no longer recommended for new development. For more information, see [Event-based Asynchronous Pattern (EAP)](event-based-asynchronous-pattern-eap.md). - **Asynchronous Programming Model (APM)** pattern (also called the pattern), which is the legacy model that uses the interface to provide asynchronous behavior. In this pattern, asynchronous operations require `Begin` and `End` methods (for example, `BeginWrite` and `EndWrite` to implement an asynchronous write operation). This pattern is no longer recommended for new development. For more information, see [Asynchronous Programming Model (APM)](asynchronous-programming-model-apm.md). diff --git a/docs/standard/base-types/choosing-between-anonymous-and-tuple.md b/docs/standard/base-types/choosing-between-anonymous-and-tuple.md index dc663164f1aa6..5196b4c20f90c 100644 --- a/docs/standard/base-types/choosing-between-anonymous-and-tuple.md +++ b/docs/standard/base-types/choosing-between-anonymous-and-tuple.md @@ -6,11 +6,11 @@ ms.date: 07/01/2020 --- # Choosing between anonymous and tuple types -Choosing the appropriate type involves considering its usability, performance, and tradeoffs compared to other types. Anonymous types have been available since C# 3.0, while generic types were introduced with .NET Framework 4.0. Since then, new options have been introduced with language level support, such as . As the names imply, these options provide a value type with the flexibility of anonymous types. In this article, you'll learn when it's appropriate to choose one type over the other. +Choose between anonymous types, , and based on usability, performance, and tradeoffs. `ValueTuple` provides a value type with the flexibility of anonymous types. This article explains when to choose each type. ## Usability and functionality -Anonymous types were introduced in C# 3.0 with Language-Integrated Query (LINQ) expressions. With LINQ, developers often project results from queries into anonymous types that hold a few select properties from the objects they're working with. Consider the following example, that instantiates an array of objects, and iterates through them projecting into an anonymous type with two properties. +With Language-Integrated Query (LINQ), you often project query results into anonymous types that hold a few selected properties from the source objects. The following example instantiates an array of objects and projects each object into an anonymous type with two properties. ```csharp var dates = new[] diff --git a/docs/standard/collections/sorted-collection-types.md b/docs/standard/collections/sorted-collection-types.md index 34ade4146e16f..ce6473e6f11f4 100644 --- a/docs/standard/collections/sorted-collection-types.md +++ b/docs/standard/collections/sorted-collection-types.md @@ -40,7 +40,7 @@ For sorted lists or dictionaries that must be accessible concurrently from multi > [!NOTE] > For values that contain their own keys (for example, employee records that contain an employee ID number), you can create a keyed collection that has some characteristics of a list and some characteristics of a dictionary by deriving from the generic class. -Starting with .NET Framework 4, the class provides a self-balancing tree that maintains data in sorted order after insertions, deletions, and searches. This class and the class implement the interface. +The class provides a self-balancing tree that maintains data in sorted order after insertions, deletions, and searches. This class and the class implement the interface. ## See also diff --git a/docs/standard/garbage-collection/large-object-heap.md b/docs/standard/garbage-collection/large-object-heap.md index 7392c4c9e7fbd..72638d0d4ec4f 100644 --- a/docs/standard/garbage-collection/large-object-heap.md +++ b/docs/standard/garbage-collection/large-object-heap.md @@ -36,7 +36,7 @@ User code can only allocate in generation 0 (small objects) or the LOH (large ob When a garbage collection is triggered, the GC traces through the live objects and compacts them. But because compaction is expensive, the GC *sweeps* the LOH; it makes a free list out of dead objects that can be reused later to satisfy large object allocation requests. Adjacent dead objects are made into one free object. -.NET Core and .NET Framework (starting with .NET Framework 4.5.1) include the property that allows users to specify that the LOH should be compacted during the next full blocking GC. And in the future, .NET may decide to compact the LOH automatically. This means that, if you allocate large objects and want to make sure that they don't move, you should still pin them. +Use the property to specify that the LOH should be compacted during the next full blocking GC. The runtime might also compact the LOH automatically. If you allocate large objects and must ensure they don't move, pin them. Figure 1 illustrates a scenario where the GC forms generation 1 after the first generation 0 GC where `Obj1` and `Obj3` are dead, and it forms generation 2 after the first generation 1 GC where `Obj2` and `Obj5` are dead. Note that this and the following figures are only for illustration purposes; they contain very few objects to better show what happens on the heap. In reality, many more objects are typically involved in a GC. diff --git a/docs/standard/garbage-collection/performance.md b/docs/standard/garbage-collection/performance.md index 76d1c46e91cdf..104d6eaa47a75 100644 --- a/docs/standard/garbage-collection/performance.md +++ b/docs/standard/garbage-collection/performance.md @@ -27,7 +27,7 @@ To install WinDbg, install Debugging Tools for Windows from the [Download Debugg ### Garbage Collection ETW Events -Event tracing for Windows (ETW) is a tracing system that supplements the profiling and debugging support provided by .NET. Starting with .NET Framework 4, [garbage collection ETW events](../../framework/performance/garbage-collection-etw-events.md) capture useful information for analyzing the managed heap from a statistical point of view. For example, the `GCStart_V1` event, which is raised when a garbage collection is about to occur, provides the following information: +Event tracing for Windows (ETW) is a tracing system that supplements the profiling and debugging support provided by .NET. [Garbage collection ETW events](../../framework/performance/garbage-collection-etw-events.md) capture useful information for analyzing the managed heap from a statistical point of view. For example, the `GCStart_V1` event, which is raised when a garbage collection is about to occur, provides the following information: - Which generation of objects is being collected. - What triggered the garbage collection. @@ -43,7 +43,7 @@ Profilers can provide comprehensive information. However, complex profilers can ### Application Domain Resource Monitoring -Starting with .NET Framework 4, Application domain resource monitoring (ARM) enables hosts to monitor CPU and memory usage by application domain. For more information, see [Application Domain Resource Monitoring](app-domain-resource-monitoring.md). +Application domain resource monitoring (ARM) enables hosts to monitor CPU and memory usage by application domain. For more information, see [Application Domain Resource Monitoring](app-domain-resource-monitoring.md). ## Troubleshoot performance issues diff --git a/docs/standard/generics.md b/docs/standard/generics.md index 726baaab817bc..fc3f6d0e9df28 100644 --- a/docs/standard/generics.md +++ b/docs/standard/generics.md @@ -9,7 +9,7 @@ ms.date: 10/09/2018 Developers use generics all the time in .NET, whether implicitly or explicitly. When you use LINQ in .NET, did you ever notice that you're working with ? Or if you ever saw an online sample of a "generic repository" for talking to databases using Entity Framework, did you see that most methods return `IQueryable`? You may have wondered what the **T** is in these examples and why it's in there. -First introduced in .NET Framework 2.0, generics are essentially a "code template" that allows developers to define [type-safe](/previous-versions/dotnet/netframework-4.0/hbzz1a9a(v=vs.100)) data structures without committing to an actual data type. For example, is a [generic collection](xref:System.Collections.Generic) that can be declared and used with any type, such as `List`, `List`, or `List`. +Generics are essentially a "code template" that allows developers to define [type-safe](/previous-versions/dotnet/netframework-4.0/hbzz1a9a(v=vs.100)) data structures without committing to an actual data type. For example, is a [generic collection](xref:System.Collections.Generic) that can be declared and used with any type, such as `List`, `List`, or `List`. To understand why generics are useful, let's take a look at a specific class before and after adding generics: . In .NET Framework 1.0, the `ArrayList` elements were of type . Any element added to the collection was silently converted into an `Object`. The same would happen when reading elements from the list. This process is known as [boxing and unboxing](../csharp/programming-guide/types/boxing-and-unboxing.md), and it impacts performance. Aside from performance, however, there's no way to determine the type of data in the list at compile time, which makes for some fragile code. Generics solve this problem by defining the type of data each instance of list will contain. For example, you can only add integers to `List` and only add Persons to `List`. diff --git a/docs/standard/io/asynchronous-file-i-o.md b/docs/standard/io/asynchronous-file-i-o.md index 45e0cad6f9b72..006be2da36ba0 100644 --- a/docs/standard/io/asynchronous-file-i-o.md +++ b/docs/standard/io/asynchronous-file-i-o.md @@ -1,7 +1,7 @@ --- title: "Asynchronous File I/O" description: Read about asynchronous file I/O in .NET. Learn async methods to simplify asynchronous operations, such as ReadAsync, WriteAsync, and more. -ms.date: "03/30/2017" +ms.date: 08/06/2026 dev_langs: - "csharp" - "vb" @@ -22,9 +22,10 @@ ms.assetid: dbdd55e7-d6b9-4f9e-8abb-ab0edd4457f7 Asynchronous operations enable you to perform resource-intensive I/O operations without blocking the main thread. This performance consideration is particularly important in a Windows 8.x Store app or desktop app where a time-consuming stream operation can block the UI thread and make your app appear as if it is not working. -Starting with .NET Framework 4.5, the I/O types include async methods to simplify asynchronous operations. An async method contains `Async` in its name, such as , , , , , and . These async methods are implemented on stream classes, such as , , and , and on classes that are used for reading from or writing to streams, such and . +The I/O types include async methods to simplify asynchronous operations. An async method contains `Async` in its name, such as , , , , , and . These async methods are implemented on stream classes, such as , , and , and on classes that are used for reading from or writing to streams, such and . -In .NET Framework 4 and earlier versions, you have to use methods such as and to implement asynchronous I/O operations. These methods are still available in current .NET versions to support legacy code; however, the async methods help you implement asynchronous I/O operations more easily. +> [!IMPORTANT] +> In .NET Framework 4 and earlier versions, you have to use methods such as and to implement asynchronous I/O operations. These methods are still available in current .NET versions to support legacy code; however, the async methods help you implement asynchronous I/O operations more easily. C# and Visual Basic each have two keywords for asynchronous programming: diff --git a/docs/standard/mef/index.md b/docs/standard/mef/index.md index 6b1959b812e43..8a9be0b9080ed 100644 --- a/docs/standard/mef/index.md +++ b/docs/standard/mef/index.md @@ -14,7 +14,7 @@ ai-usage: ai-assisted # Managed Extensibility Framework (MEF) -This article provides an overview of the Managed Extensibility Framework that was introduced in .NET Framework 4. +This article provides an overview of the Managed Extensibility Framework. ## What is MEF? @@ -48,7 +48,7 @@ An extensible application written by using MEF declares an import that can be fi ## Where MEF is available -MEF is available in .NET Framework 4 and later versions, and in .NET 5 and later versions. You can use MEF in your client applications, whether they use Windows Forms, WPF, or any other technology, or in server applications that use ASP.NET. +You can use MEF in your client applications, whether they use Windows Forms, WPF, or any other technology, or in server applications that use ASP.NET. ## MEF and MAF diff --git a/docs/standard/native-interop/importing-a-type-library-as-an-assembly.md b/docs/standard/native-interop/importing-a-type-library-as-an-assembly.md index 8ca59ec17799c..8e94b7894fc9e 100644 --- a/docs/standard/native-interop/importing-a-type-library-as-an-assembly.md +++ b/docs/standard/native-interop/importing-a-type-library-as-an-assembly.md @@ -26,7 +26,7 @@ COM type definitions usually reside in a type library. In contrast, CLS-complian There are two ways to make this type information available to your application: -- Using design-time-only interop assemblies: Beginning with .NET Framework 4, you can instruct the compiler to embed type information from the interop assembly into your executable. The compiler embeds only the type information that your application uses. You do not have to deploy the interop assembly with your application. This is the recommended technique. +- Using design-time-only interop assemblies: You can instruct the compiler to embed type information from the interop assembly into your executable. The compiler embeds only the type information that your application uses. You do not have to deploy the interop assembly with your application. This is the recommended technique. - Deploying interop assemblies: You can create a standard reference to the interop assembly. In this case, the interop assembly must be deployed with your application. If you employ this technique, and you are not using a private COM component, always reference the primary interop assembly (PIA) published by the author of the COM component you intend to incorporate in your managed code. For more information about producing and using primary interop assemblies, see [Primary Interop Assemblies](/previous-versions/dotnet/netframework-4.0/aax7sdch(v=vs.100)). diff --git a/docs/standard/native-interop/type-equivalence-and-embedded-interop-types.md b/docs/standard/native-interop/type-equivalence-and-embedded-interop-types.md index 148add67cd457..777487b79e541 100644 --- a/docs/standard/native-interop/type-equivalence-and-embedded-interop-types.md +++ b/docs/standard/native-interop/type-equivalence-and-embedded-interop-types.md @@ -1,6 +1,6 @@ --- title: "Type equivalence and embedded interop types" -description: Understand type equivalence between .NET types and members with a managed assembly, and COM types that are embedded into that assembly. Available in .NET; introduced in .NET Framework 4. +description: Understand type equivalence between .NET types and members with a managed assembly, and COM types that are embedded into that assembly. ms.date: 07/08/2026 ai-usage: ai-assisted helpviewer_keywords: diff --git a/docs/standard/parallel-programming/index.md b/docs/standard/parallel-programming/index.md index bc5894eb5c6d4..a2cf0cf584e79 100644 --- a/docs/standard/parallel-programming/index.md +++ b/docs/standard/parallel-programming/index.md @@ -9,7 +9,7 @@ helpviewer_keywords: Many personal computers and workstations have multiple CPU cores that enable multiple threads to be executed simultaneously. To take advantage of the hardware, you can parallelize your code to distribute work across multiple processors. -In the past, parallelization required low-level manipulation of threads and locks. Visual Studio and .NET enhance support for parallel programming by providing a runtime, class library types, and diagnostic tools. These features, which were introduced in .NET Framework 4, simplify parallel development. You can write efficient, fine-grained, and scalable parallel code in a natural idiom without having to work directly with threads or the thread pool. +In the past, parallelization required low-level manipulation of threads and locks. Visual Studio and .NET enhance support for parallel programming by providing a runtime, class library types, and diagnostic tools. You can write efficient, fine-grained, and scalable parallel code in a natural idiom without having to work directly with threads or the thread pool. The following illustration provides a high-level overview of the parallel programming architecture in .NET. diff --git a/docs/standard/serialization/binaryformatter-migration-guide/choose-a-serializer.md b/docs/standard/serialization/binaryformatter-migration-guide/choose-a-serializer.md index adf2c312038b3..5909501b00012 100644 --- a/docs/standard/serialization/binaryformatter-migration-guide/choose-a-serializer.md +++ b/docs/standard/serialization/binaryformatter-migration-guide/choose-a-serializer.md @@ -52,7 +52,7 @@ Serialization excludes non-public and readonly members unless specifically handl ## XML using DataContractSerializer - was introduced in .NET Framework 3.0 and is used to serialize and deserialize data sent in Windows Communication Foundation (WCF) messages. is an XML serializer that **fully supports the serialization programming model that was used by the `BinaryFormatter`**, which means it honors the `[Serializable]` attribute and implementation of . Hence, it's the serializer that requires the least amount of effort to migrate to. It does, however, require the known types to be specified up-front (but most .NET collections and primitive types are on a default allow-list and don't need to be specified). + is used to serialize and deserialize data sent in Windows Communication Foundation (WCF) messages. is an XML serializer that **fully supports the serialization programming model that was used by the `BinaryFormatter`**, which means it honors the `[Serializable]` attribute and implementation of . Hence, it's the serializer that requires the least amount of effort to migrate to. It does, however, require the known types to be specified up-front (but most .NET collections and primitive types are on a default allow-list and don't need to be specified). While `DataContractSerializer` carries those functional benefits when migrating from BinaryFormatter, it is not as modern or performant as the other choices. diff --git a/docs/standard/threading/canceling-threads-cooperatively.md b/docs/standard/threading/canceling-threads-cooperatively.md index b2da03dce0e09..20bbb52efc9c8 100644 --- a/docs/standard/threading/canceling-threads-cooperatively.md +++ b/docs/standard/threading/canceling-threads-cooperatively.md @@ -11,7 +11,7 @@ ms.assetid: d2d6d5fd-e263-4fa0-847b-2fc3e0d82337 --- # Canceling threads cooperatively -Prior to .NET Framework 4, .NET provided no built-in way to cancel a thread cooperatively after it was started. However, starting with .NET Framework 4, you can use a to cancel threads, just as you can use them to cancel objects or PLINQ queries. Although the class does not offer built-in support for cancellation tokens, you can pass a token to a thread procedure by using the constructor that takes a delegate. The following example demonstrates how to do this. +You can use a to cancel threads, just as you can use them to cancel objects or PLINQ queries. Although the class does not offer built-in support for cancellation tokens, you can pass a token to a thread procedure by using the constructor that takes a delegate. The following example demonstrates how to do this. [!code-csharp[Cancellation#14](../../../samples/snippets/csharp/VS_Snippets_Misc/cancellation/cs/CooperativeThreads.cs#14)] [!code-vb[Cancellation#14](../../../samples/snippets/visualbasic/VS_Snippets_Misc/cancellation/vb/CooperativeThreads.vb#14)] diff --git a/docs/standard/threading/cancellation-in-managed-threads.md b/docs/standard/threading/cancellation-in-managed-threads.md index 9d63f01047848..25aab17c6e3b6 100644 --- a/docs/standard/threading/cancellation-in-managed-threads.md +++ b/docs/standard/threading/cancellation-in-managed-threads.md @@ -12,7 +12,7 @@ ms.assetid: eea11fe5-d8b0-4314-bb5d-8a58166fb1c3 --- # Cancellation in Managed Threads -Starting with .NET Framework 4, .NET uses a unified model for cooperative cancellation of asynchronous or long-running synchronous operations. This model is based on a lightweight object called a cancellation token. The object that invokes one or more cancelable operations, for example by creating new threads or tasks, passes the token to each operation. Individual operations can in turn pass copies of the token to other operations. At some later time, the object that created the token can use it to request that the operations stop what they are doing. Only the requesting object can issue the cancellation request, and each listener is responsible for noticing the request and responding to it in an appropriate and timely manner. +.NET uses a unified model for cooperative cancellation of asynchronous or long-running synchronous operations. This model is based on a lightweight object called a cancellation token. The object that invokes one or more cancelable operations, for example by creating new threads or tasks, passes the token to each operation. Individual operations can in turn pass copies of the token to other operations. At some later time, the object that created the token can use it to request that the operations stop what they are doing. Only the requesting object can issue the cancellation request, and each listener is responsible for noticing the request and responding to it in an appropriate and timely manner. The general pattern for implementing the cooperative cancellation model is: diff --git a/docs/standard/threading/countdownevent.md b/docs/standard/threading/countdownevent.md index 380b8712da8ba..bea5eef54f94d 100644 --- a/docs/standard/threading/countdownevent.md +++ b/docs/standard/threading/countdownevent.md @@ -35,7 +35,7 @@ ms.assetid: eec3812a-e20f-4ecd-bfef-6921d508b708 ## CountdownEvent With Cancellation - The following example shows how to cancel the wait operation on by using a cancellation token. The basic pattern follows the model for unified cancellation, which was introduced in .NET Framework 4. For more information, see [Cancellation in Managed Threads](cancellation-in-managed-threads.md). + The following example shows how to cancel the wait operation on by using a cancellation token. The basic pattern follows the model for unified cancellation. For more information, see [Cancellation in Managed Threads](cancellation-in-managed-threads.md). [!code-csharp[CDS_CountdownEvent#02](../../../samples/snippets/csharp/VS_Snippets_Misc/cds_countdownevent/cs/countdownevent.cs#02)] [!code-vb[CDS_CountdownEvent#02](../../../samples/snippets/visualbasic/VS_Snippets_Misc/cds_countdownevent/vb/canceleventwait.vb#02)] diff --git a/docs/standard/threading/managed-threading-basics.md b/docs/standard/threading/managed-threading-basics.md index 6705bc8a9136e..13faf9919b216 100644 --- a/docs/standard/threading/managed-threading-basics.md +++ b/docs/standard/threading/managed-threading-basics.md @@ -1,7 +1,7 @@ --- title: "Managed Threading Basics" description: See links to other managed threading articles, covering topics such as exceptions, synchronizing data, foreground & background threads, local storage, and more. -ms.date: "03/30/2017" +ms.date: 08/06/2026 helpviewer_keywords: - "multiple threads" - "threading [.NET], multiple threads" @@ -18,7 +18,7 @@ The first five articles of this section are designed to help you determine when The remaining articles in this section cover advanced topics, including the interaction of managed threading with the Windows operating system. > [!NOTE] -> Starting with .NET Framework 4, the Task Parallel Library and PLINQ provide APIs for task and data parallelism in multi-threaded programs. For more information, see [Parallel Programming](../parallel-programming/index.md). +> The Task Parallel Library and PLINQ provide APIs for task and data parallelism in multi-threaded programs. For more information, see [Parallel Programming](../parallel-programming/index.md). ## In this section diff --git a/docs/standard/threading/managed-threading-best-practices.md b/docs/standard/threading/managed-threading-best-practices.md index 8af46be364db2..50975bd55b302 100644 --- a/docs/standard/threading/managed-threading-best-practices.md +++ b/docs/standard/threading/managed-threading-best-practices.md @@ -16,7 +16,7 @@ ms.assetid: e51988e7-7f4b-4646-a06d-1416cee8d557 Multithreading requires careful programming. For most tasks, you can reduce complexity by queuing requests for execution by thread pool threads. This topic addresses more difficult situations, such as coordinating the work of multiple threads, or handling threads that block. > [!NOTE] -> Starting with .NET Framework 4, the Task Parallel Library and PLINQ provide APIs that reduce some of the complexity and risks of multi-threaded programming. For more information, see [Parallel Programming in .NET](../parallel-programming/index.md). +> The Task Parallel Library and PLINQ provide APIs that reduce some of the complexity and risks of multi-threaded programming. For more information, see [Parallel Programming in .NET](../parallel-programming/index.md). ## Deadlocks and race conditions diff --git a/docs/standard/threading/threads-and-threading.md b/docs/standard/threading/threads-and-threading.md index 67a6a04885a60..20881ecb04bf1 100644 --- a/docs/standard/threading/threads-and-threading.md +++ b/docs/standard/threading/threads-and-threading.md @@ -31,7 +31,7 @@ If your program performs operations that can be done in parallel, the total exec ## How to use multithreading in .NET -Starting with .NET Framework 4, the recommended way to utilize multithreading is to use [Task Parallel Library (TPL)](../parallel-programming/task-parallel-library-tpl.md) and [Parallel LINQ (PLINQ)](../parallel-programming/introduction-to-plinq.md). For more information, see [Parallel programming](../parallel-programming/index.md). +The recommended way to utilize multithreading is to use [Task Parallel Library (TPL)](../parallel-programming/task-parallel-library-tpl.md) and [Parallel LINQ (PLINQ)](../parallel-programming/introduction-to-plinq.md). For more information, see [Parallel programming](../parallel-programming/index.md). Both TPL and PLINQ rely on the threads. The class provides a .NET application with a pool of worker threads. You can also use thread pool threads. For more information, see [The managed thread pool](the-managed-thread-pool.md). diff --git a/docs/visual-basic/programming-guide/language-features/data-types/tuples.md b/docs/visual-basic/programming-guide/language-features/data-types/tuples.md index c91dcbd07d15f..8d78ae02755ad 100644 --- a/docs/visual-basic/programming-guide/language-features/data-types/tuples.md +++ b/docs/visual-basic/programming-guide/language-features/data-types/tuples.md @@ -160,7 +160,7 @@ You can then call the method with code like the following: ## Visual Basic tuples and tuples in the .NET Framework -A Visual Basic tuple is an instance of one of the **System.ValueTuple** generic types, which were introduced in .NET Framework 4.7. The .NET Framework also includes a set of generic **System.Tuple** classes. These classes, however, differ from Visual Basic tuples and the **System.ValueTuple** generic types in a number of ways: +A Visual Basic tuple is an instance of one of the **System.ValueTuple** generic types. The .NET Framework also includes a set of generic **System.Tuple** classes. These classes, however, differ from Visual Basic tuples and the **System.ValueTuple** generic types in a number of ways: - The elements of the **Tuple** classes are properties named `Item1`, `Item2`, and so on. In Visual Basic tuples and the **ValueTuple** types, tuple elements are fields. From b0eb67d4ff8750c3b18598690f80aa73cde12fb4 Mon Sep 17 00:00:00 2001 From: "Andy De George (from Dev Box)" Date: Thu, 6 Aug 2026 15:49:06 -0700 Subject: [PATCH 2/2] Feedback --- docs/core/extensions/httpclient-factory.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/core/extensions/httpclient-factory.md b/docs/core/extensions/httpclient-factory.md index 676aa40a31621..026ceeb1e766c 100644 --- a/docs/core/extensions/httpclient-factory.md +++ b/docs/core/extensions/httpclient-factory.md @@ -8,7 +8,7 @@ ms.date: 08/06/2026 This article explains how to use the `IHttpClientFactory` interface to create `HttpClient` types with .NET fundamentals such as dependency injection (DI), logging, and configuration. makes HTTP requests and handles HTTP responses from web resources identified by a . The HTTP protocol makes up the vast majority of all internet traffic. - is available in .NET, but not .NET Framework. It creates `HttpClient` instances with custom configurations and lets .NET workloads use resilient, transient-fault-handling third-party middleware. +To use in .NET or .NET Framework, reference the [`Microsoft.Extensions.Http`](https://www.nuget.org/packages/microsoft.extensions.http) NuGet package. The factory creates `HttpClient` instances with custom configurations and lets .NET workloads use resilient, transient-fault-handling third-party middleware. > [!WARNING] > If your app requires cookies, it's recommended to avoid using . Pooling the instances results in sharing of objects. Unanticipated sharing might leak cookies between unrelated parts of the application. Moreover, when expires, the handler is recycled, meaning that all cookies stored in its are lost. @@ -19,7 +19,7 @@ This article explains how to use the `IHttpClientFactory` interface to create `H ## The `IHttpClientFactory` type -All of the sample source code provided in this article requires the installation of the [`Microsoft.Extensions.Http`](https://www.nuget.org/packages/microsoft.extensions.http) NuGet package. Furthermore, the code examples demonstrate the usage of HTTP `GET` requests to retrieve user `Todo` objects from the free [{JSON} Placeholder](https://jsonplaceholder.typicode.com/) API. +All of the sample source code provided in this article requires the [`Microsoft.Extensions.Http`](https://www.nuget.org/packages/microsoft.extensions.http) and [`Microsoft.Extensions.Hosting`](https://www.nuget.org/packages/microsoft.extensions.hosting) NuGet packages. Furthermore, the code examples demonstrate the usage of HTTP `GET` requests to retrieve user `Todo` objects from the free [{JSON} Placeholder](https://jsonplaceholder.typicode.com/) API. When you call any of the extension methods, you're adding the `IHttpClientFactory` and related services to the . The `IHttpClientFactory` type offers the following benefits: