mirror of
https://github.com/mastercodeon314/KsDumper-11.git
synced 2024-11-28 00:10:52 +01:00
48 lines
1.2 KiB
C#
48 lines
1.2 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Threading;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
public class CancelableTask<T>
|
|||
|
{
|
|||
|
private CancellationTokenSource cancellationTokenSource;
|
|||
|
|
|||
|
public CancelableTask(CancellationToken cancellationToken)
|
|||
|
{
|
|||
|
cancellationTokenSource = new CancellationTokenSource();
|
|||
|
cancellationToken.Register(() => cancellationTokenSource.Cancel());
|
|||
|
}
|
|||
|
|
|||
|
public Task<T> CreateTask(Func<CancellationToken, T> taskFunction)
|
|||
|
{
|
|||
|
var taskCompletionSource = new TaskCompletionSource<T>();
|
|||
|
|
|||
|
Task.Run(() =>
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
T result = taskFunction(cancellationTokenSource.Token);
|
|||
|
taskCompletionSource.TrySetResult(result);
|
|||
|
}
|
|||
|
catch (OperationCanceledException)
|
|||
|
{
|
|||
|
taskCompletionSource.TrySetCanceled();
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
taskCompletionSource.TrySetException(ex);
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
return taskCompletionSource.Task;
|
|||
|
}
|
|||
|
|
|||
|
public void Cancel()
|
|||
|
{
|
|||
|
cancellationTokenSource.Cancel();
|
|||
|
}
|
|||
|
}
|
|||
|
|