RSCG – AsyncIt

RSCG – AsyncIt
 
 

name AsyncIt
nuget https://www.nuget.org/packages/AsyncIt/
link https://github.com/oleg-shilo/AsyncIt/
author Oleg Shilo

Generate async from sync or sync from async

 

This is how you can use AsyncIt .

The code that you start with is


<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

	<PropertyGroup>
		<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
		<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
	</PropertyGroup>

	<ItemGroup>
	  <PackageReference Include="AsyncIt" Version="1.0.0-pre4">
	    <PrivateAssets>all</PrivateAssets>
	    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
	  </PackageReference>
	</ItemGroup>
</Project>


The code that you will use is



using AsyncDemo;

var p=new Person();
var result=await p.RunAsync();
Console.WriteLine(result);
result=p.Run();
Console.WriteLine(result);



using System.ComponentModel;
namespace AsyncDemo;

[AsyncIt.Async(Interface = AsyncIt.Interface.Sync)]
internal partial class Person
{   
    public async Task<bool> RunAsync()
    {
        await Task.Delay(1000);
        return true;
    }
}


 

The code that is generated is

// <auto-generated/>

using System;
using System.Reflection;

namespace AsyncIt
{

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
    public class AsyncAttribute : Attribute
    {
        public AsyncAttribute()
        {
        }

        public AsyncAttribute(Algorithm algorithm, Interface @interface)
        {
            Algorithm = algorithm;
            Interface = @interface;
        }
        public AsyncAttribute(Interface @interface, Algorithm algorithm)
        {
            Algorithm = algorithm;
            Interface = @interface;
        }
        public AsyncAttribute(Algorithm algorithm)
        {
            Algorithm = algorithm;
        }

        public AsyncAttribute(Interface @interface)
        {
            Interface = @interface;
        }
        public Algorithm Algorithm { get; set; }
        public Interface Interface { get; set; }
        internal string TypeGenericArgs;
        internal string NamePattern;
    }

    [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)]
    public sealed class AsyncExternalAttribute : Attribute
    {
        public AsyncExternalAttribute()
        {
        }
        public AsyncExternalAttribute(Type type)
        {
            Type = type;
        }

        public AsyncExternalAttribute(Type type, Interface @interface)
        {
            Type = type;
            Interface = @interface;
        }
        public AsyncExternalAttribute(Type type, Interface @interface, string methods)
        {
            Type = type;
            Interface = @interface;
            Methods = methods;
        }

        public Interface Interface { get; set; }
        public Type Type { get; set; }
        public string Methods { get; set; } = "*";
    }

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public class IgnoreAttribute : Attribute
    {
    }

    public enum Interface
    {
        Async,
        Sync,
        Full,
    }

    public enum Algorithm
    {
        PartialType,
        ExtensionMethods
    }
}
// <auto-generated/>
using System.ComponentModel;

namespace AsyncDemo
{
    internal partial class Person
    {
        /// <summary>
        /// The synchronous version of <see cref="Person.RunAsync()"/>.
        /// </summary>
        public bool Run()
            => RunAsync().Result;
    }
}

Code and pdf at

https://ignatandrei.github.io/RSCG_Examples/v2/docs/AsyncIt


Posted

in

, ,

by

Tags: