mirror of
https://github.com/gwdevhub/Daybreak.git
synced 2026-07-15 15:19:57 +00:00
81 lines
1.7 KiB
C#
81 lines
1.7 KiB
C#
namespace Daybreak.API.Models;
|
|
|
|
public sealed class WorkItem(
|
|
Action action,
|
|
TaskCompletionSource tcs,
|
|
CancellationToken token) : IWorkItem
|
|
{
|
|
private readonly Action action = action;
|
|
private readonly TaskCompletionSource tcs = tcs;
|
|
|
|
public CancellationToken CancellationToken { get; } = token;
|
|
|
|
public void Execute()
|
|
{
|
|
if (this.CancellationToken.IsCancellationRequested)
|
|
{
|
|
this.tcs.TrySetCanceled(this.CancellationToken);
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
this.action();
|
|
this.tcs.TrySetResult();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
this.tcs.TrySetException(ex);
|
|
}
|
|
}
|
|
|
|
public void Cancel()
|
|
{
|
|
this.tcs.TrySetCanceled(this.CancellationToken);
|
|
}
|
|
|
|
public void Exception(Exception ex)
|
|
{
|
|
this.tcs.TrySetException(ex);
|
|
}
|
|
}
|
|
|
|
public sealed class WorkItem<T>(
|
|
Func<T> func,
|
|
TaskCompletionSource<T> tcs,
|
|
CancellationToken token) : IWorkItem
|
|
{
|
|
private readonly Func<T> func = func;
|
|
private readonly TaskCompletionSource<T> tcs = tcs;
|
|
|
|
public CancellationToken CancellationToken { get; } = token;
|
|
|
|
public void Execute()
|
|
{
|
|
if (this.CancellationToken.IsCancellationRequested)
|
|
{
|
|
this.tcs.TrySetCanceled(this.CancellationToken);
|
|
return;
|
|
}
|
|
|
|
try
|
|
{
|
|
this.tcs.TrySetResult(this.func());
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
this.tcs.TrySetException(ex);
|
|
}
|
|
}
|
|
|
|
public void Cancel()
|
|
{
|
|
this.tcs.TrySetCanceled(this.CancellationToken);
|
|
}
|
|
|
|
public void Exception(Exception ex)
|
|
{
|
|
this.tcs.TrySetException(ex);
|
|
}
|
|
}
|