Фабрики задач
Фабрика задач представлена классом System.Threading.Tasks.TaskFactory, который создает объекты Task, или классом System.Threading.Tasks.TaskFactory<TResult>, который создает объекты Task<TResult>. Оба класса содержат методы, используемые для:
создания задач и немедленного начала работы над ними. Дополнительные сведения см. в разделе Параллелизм задач (библиотека параллельных задач);
создания продолжения задачи, которое начинает выполняться после завершения какого-либо или всех массивов задач. Дополнительные сведения см. в разделе Задачи продолжения;
создания задач, которые представляют пары методов Begin/End, следующих за асинхронной моделью программирования. Дополнительные сведения см. в разделе Библиотека параллельных задач и традиционное асинхронное программирование .NET.
Класс Task имеет статическое свойство, которое представляет TaskFactory по умолчанию. Обычно методы TaskFactory вызываются с помощью свойства Factory, как показано в следующем примере.
[Visual Basic]
Dim taskA as Task = Task.Factory.StartNew(Sub( ...))
[C#]
Task taskA = Task.Factory.StartNew( () => ...);
В большинстве сценариев нет необходимости наследовать новый класс из TaskFactory. Однако иногда полезно настроить новый TaskFactory и использовать его для указания определенных параметров или связывания задачи с пользовательским планировщиком. Следующий пример демонстрирует настройку нового TaskFactory, который создает задачи, использующие указанный TaskScheduler, и имеют заданные параметры TaskCreationOptions.
Class Program
Shared Sub Main()
Dim cts As CancellationTokenSource = New CancellationTokenSource()
Dim _factory As TaskFactory = New TaskFactory(
cts.Token,
TaskCreationOptions.PreferFairness,
TaskContinuationOptions.ExecuteSynchronously,
New MyScheduler())
Dim t2 = _factory.StartNew(Sub() DoWork())
End Sub
Shared Sub DoWork()
' ...
End Sub
class Program
{
static CancellationTokenSource cts = new CancellationTokenSource();
private static TaskFactory _factory = new TaskFactory(
cts.Token,
TaskCreationOptions.PreferFairness,
TaskContinuationOptions.ExecuteSynchronously,
new MyScheduler());
static void Main(string[] args)
{
var t2 = _factory.StartNew(() => DoWork());
}
static void DoWork() {/*...*/ }
}