网上演练
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
4.3 KiB

#if NET20 || NET30 || NET35 || !NET_4_6
namespace System.Threading.Tasks
{
public partial class Task
{
public static Task Run(Action action)
{
var result = new Task(action, CancellationToken.None, TaskCreationOptions.DenyChildAttach);
result.Start();
return result;
}
public static Task Run(Action action, CancellationToken cancellationToken)
{
var result = new Task(action, cancellationToken, TaskCreationOptions.DenyChildAttach);
if (!cancellationToken.IsCancellationRequested)
{
result.Start(result.ExecutingTaskScheduler, false);
}
return result;
}
public static Task Run(Func<Task> action)
{
if (action == null)
{
throw new ArgumentNullException();
}
var result = new Task
(
() =>
{
var task = action();
task.Start(task.ExecutingTaskScheduler, false);
task.Wait();
if (task.IsFaulted)
{
throw task.Exception;
}
if (task.IsCanceled)
{
throw new TaskCanceledException(task);
}
},
CancellationToken.None,
TaskCreationOptions.DenyChildAttach
);
result.Start();
return result;
}
public static Task Run(Func<Task> action, CancellationToken cancellationToken)
{
if (action == null)
{
throw new ArgumentNullException();
}
var result = new Task
(
() =>
{
var task = action();
task.Start(task.ExecutingTaskScheduler, false);
task.Wait(cancellationToken);
if (task.IsFaulted)
{
throw task.Exception;
}
if (task.IsCanceled)
{
throw new TaskCanceledException(task);
}
},
cancellationToken,
TaskCreationOptions.DenyChildAttach
);
if (!cancellationToken.IsCancellationRequested)
{
result.Start(result.ExecutingTaskScheduler, false);
}
return result;
}
public static Task<TResult> Run<TResult>(Func<TResult> function)
{
var result = new Task<TResult>(function, CancellationToken.None, TaskCreationOptions.DenyChildAttach);
result.Start();
return result;
}
public static Task<TResult> Run<TResult>(Func<TResult> function, CancellationToken cancellationToken)
{
var result = new Task<TResult>(function, cancellationToken, TaskCreationOptions.DenyChildAttach);
if (!cancellationToken.IsCancellationRequested)
{
result.Start(result.ExecutingTaskScheduler, false);
}
return result;
}
public static Task<TResult> Run<TResult>(Func<Task<TResult>> function)
{
if (function == null)
{
throw new ArgumentNullException();
}
var result = new Task<TResult>(() => function().Result, CancellationToken.None, TaskCreationOptions.DenyChildAttach);
result.Start();
return result;
}
public static Task<TResult> Run<TResult>(Func<Task<TResult>> function, CancellationToken cancellationToken)
{
if (function == null)
{
throw new ArgumentNullException();
}
var result = new Task<TResult>(() => function().Result, cancellationToken, TaskCreationOptions.DenyChildAttach);
if (!cancellationToken.IsCancellationRequested)
{
result.Start(result.ExecutingTaskScheduler, false);
}
return result;
}
}
}
#endif