Skip to content

Instantly share code, notes, and snippets.

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PublishAot>true</PublishAot>
<IlcDisableReflection>true</IlcDisableReflection>
</PropertyGroup>
public static Task WhenAllOrFaulted(params Task[] tasks)
{
var faultedContinuations = new Task[tasks.Length];
var faultedTask = new TaskCompletionSource<Task>();
for (int i = 0; i < tasks.Length; i++)
{
faultedContinuations[i] = tasks[i].ContinueWith(t => faultedTask.SetResult(t), TaskContinuationOptions.OnlyOnFaulted);
}
public static Task WhenAllOrFaulted(params Task[] tasks)
{
var faultedContinuations = new Task[tasks.Length];
for (int i = 0; i < tasks.Length; i++)
{
faultedContinuations[i] = tasks[i].ContinueWith(_ => {}, TaskContinuationOptions.OnlyOnFaulted);
}
var faultedTask = Task.WhenAny(faultedContinuations);
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
static void SyncMethod()
{
// Run a garbage collection in 1 second
Task.Delay(1000).ContinueWith(_ => { GC.Collect(); });
var taskCompletionSource = new TaskCompletionSource();
Action myDelegate = () => taskCompletionSource.SetResult();
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
static async Task AsyncMethod()
{
// Run a garbage collection in 1 second
Task.Delay(1000).ContinueWith(_ => { GC.Collect(); });
var taskCompletionSource = new TaskCompletionSource();
Action myDelegate = () => taskCompletionSource.SetResult();
[MethodImpl(MethodImplOptions.AggressiveOptimization)]
static void Test()
{
var obj = new object();
// Run a garbage collection in 1 second
Task.Delay(1000).ContinueWith(_ => { GC.Collect(); });
// As soon as MyNativeMethod is called, there are no more references to obj
MyNativeMethod(new WeakReference(obj));
void Test()
{
var obj = new Object();
DoStuffWithObj(obj);
// At this point, the GC knows the object isn't used anymore and may collect obj
DoStuff();
}
var taskCompletionSource = new TaskCompletionSource();
MyDelegateType myDelegate = () => taskCompletionSource.SetResult();
NativeMethods.MyNativeMethod(myDelegate);
await taskCompletionSource.Task;
GC.KeepAlive(myDelegate);
public unsafe class Getter
{
private delegate*<Obj, SomeStruct*, SomeStruct*> _functionPointer;
public Getter(string propName)
{
var methodInfo = typeof(Obj).GetProperty(propName).GetGetMethod();
_functionPointer = (delegate*<Obj, SomeStruct*, SomeStruct*>)methodInfo.MethodHandle.GetFunctionPointer();
}
public class MyClass
{
public static LargeStruct StaticMethod(MyClass obj)
{
// ...
}
public LargeStruct InstanceMethod()
{
// ...