Gapotchenko.FX.Threading 2022.2.7

The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org. Prefix Reserved
.NET 5.0 .NET Core 2.0 .NET Standard 2.0 .NET Framework 4.6
dotnet add package Gapotchenko.FX.Threading --version 2022.2.7
NuGet\Install-Package Gapotchenko.FX.Threading -Version 2022.2.7
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Gapotchenko.FX.Threading" Version="2022.2.7" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Gapotchenko.FX.Threading --version 2022.2.7
#r "nuget: Gapotchenko.FX.Threading, 2022.2.7"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Gapotchenko.FX.Threading as a Cake Addin
#addin nuget:?package=Gapotchenko.FX.Threading&version=2022.2.7

// Install Gapotchenko.FX.Threading as a Cake Tool
#tool nuget:?package=Gapotchenko.FX.Threading&version=2022.2.7

Overview

The module provides extended primitives for multithreaded and asynchronous programming.

TaskBridge

TaskBridge class from Gapotchenko.FX.Threading module provides seamless interoperability between synchronous and asynchronous code execution models.

Executing an async task from synchronous code poses a few rather big challenges in conventional .NET:

  • The wait operation for an async task is prone to deadlocks unless a proper synchronization context is in place
  • The cancellation models of sync and async code are different and often incompatible

Meet TaskBridge. It makes interoperability a breeze:

using Gapotchenko.FX.Threading.Tasks;
using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        TaskBridge.Execute(RunAsync);
    }

    static async Task RunAsync()
    {
        await Console.Out.WriteLineAsync("Hello, Async World!");
    }
}

Cancellation Models

TaskBridge provides automatic interoperability between different cancellation models.

Let's call a cancelable async method from a synchronous thread that can be aborted by Thread.Abort() method:

using Gapotchenko.FX.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;

void SyncMethod() // can be canceled by Thread.Abort()
{
    // Executes an async task that is gracefully canceled via cancellation
    // token when current thread is being aborted or interrupted.
    TaskBridge.Execute(DoJobAsync); // <-- TaskBridge DOES THE MAGIC
}

async Task DoJobAsync(CancellationToken ct)
{
    …
    // Gracefully handles cancellation opportunities.
    ct.ThrowIfCancellationRequested();
    …
}

You see this? A simple one-liner for a complete interoperability between two execution models.

Now, let's take a look at the opposite scenario where a cancelable async task calls an abortable synchronous code:

using Gapotchenko.FX.Threading.Tasks;
using System.Threading;
using System.Threading.Tasks;

async Task DoJobAsync(CancellationToken ct) // can be canceled by a specified cancellation token
{
    // Executes a synchronous method that is thread-aborted when
    // a specified cancellation token is being canceled.
    await TaskBridge.ExecuteAsync(SyncMethod, ct); // <-- TaskBridge DOES THE MAGIC
}

void SyncMethod()
{
    …
}

As you can see, TaskBridge has a lot of chances to become your tool #1, as it elegantly solves a world-class problem of bridging sync and async models together.

Sequential, an Antogonist to Parallel

.NET platform provides System.Threading.Tasks.Parallel class that contains a bunch of static methods allowing to execute the tasks in parallel. But what if you want to temporarily switch them to a sequential execution mode?

Of course, you can do that manually, for example, by changing Parallel.ForEach method to foreach C# language keyword. But this is a lot of manual labour prone to errors. That's why Gapotchenko.FX.Threading module provides Sequential class, an anotogonist to Parallel. It allows to make the switch by changing just the class name from Parallel to Sequential in a corresponding function call. So Parallel.ForEach becomes Sequential.ForEach, and voila, the tasks are now executed sequentially allowing you to isolate that pesky multithreading bug you were hunting for.

Commonly Used Types

  • Gapotchenko.FX.Threading.TaskBridge

Other Modules

Let's continue with a look at some other modules provided by Gapotchenko.FX:

Or look at the full list of modules.

Product Compatible and additional computed target framework versions.
.NET net5.0 is compatible.  net5.0-windows was computed.  net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed. 
.NET Core netcoreapp2.0 is compatible.  netcoreapp2.1 is compatible.  netcoreapp2.2 was computed.  netcoreapp3.0 is compatible.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 is compatible. 
.NET Framework net46 is compatible.  net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 is compatible.  net472 is compatible.  net48 was computed.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Additional computed target framework(s)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (4)

Showing the top 4 NuGet packages that depend on Gapotchenko.FX.Threading:

Package Downloads
Gapotchenko.FX.Diagnostics.Process The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

The module provides extended functionality for process manipulation.

Gapotchenko.FX.Collections The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

The module provides data structures and primitives for collections.

Gapotchenko.FX.Profiles.Core The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

Represents the Core profile of Gapotchenko.FX.

Gapotchenko.FX.Data.Linq The ID prefix of this package has been reserved for one of the owners of this package by NuGet.org.

The module provides the asynchronous data access support for LINQ2SQL technology.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
2022.2.7 11,130 5/1/2022
2022.2.5 1,845 5/1/2022
2022.1.4 1,904 4/6/2022
2021.2.21 1,962 1/21/2022
2021.2.20 1,911 1/17/2022
2021.1.5 5,085 7/6/2021
2020.2.2-beta 423 11/21/2020
2020.1.15 4,299 11/5/2020
2020.1.9-beta 421 7/14/2020
2020.1.8-beta 440 7/14/2020
2020.1.7-beta 460 7/14/2020
2020.1.1-beta 529 2/11/2020
2019.3.7 1,405 11/4/2019
2019.2.20 824 8/13/2019
2019.1.151 24,214 3/30/2019