Поделиться через


Фабрики задач

Фабрика задач представлена классом System.Threading.Tasks.TaskFactory, который создает объекты Task, или классом System.Threading.Tasks.TaskFactory<TResult>, который создает объекты Task<TResult>. Оба класса содержат методы, используемые для:

Класс 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() {/*...*/ }
}

См. также

Основные понятия

Параллельное программирование в .NET Framework