TaskFactory<TResult> 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
Task<TResult> 개체를 만들고 예약하도록 지원합니다.
generic <typename TResult>
public ref class TaskFactory
public class TaskFactory<TResult>
type TaskFactory<'Result> = class
Public Class TaskFactory(Of TResult)
형식 매개 변수
- TResult
이 클래스의 메서드가 Task<TResult> 만드는 개체의 반환 값입니다.
- 상속
-
TaskFactory<TResult>
예제
다음 예제에서는 정적 Factory 속성을 사용하여 메서드를 두 개 호출합니다 TaskFactory<TResult>.StartNew . 첫 번째 작업은 사용자의 MyDocuments 디렉터리에 있는 파일 이름으로 채워진 문자열 배열을 반환하고, 두 번째 작업은 사용자의 MyDocuments 디렉터리의 하위 디렉터리 이름으로 채워진 문자열 배열을 반환합니다. 그런 다음 두 태스크가 TaskFactory.ContinueWhenAll(Task[], Action<Task[]>) 실행을 완료한 후 반환된 배열의 파일 및 디렉터리 수에 대한 정보를 표시하는 메서드를 호출합니다.
using System;
using System.IO;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
Task<string[]>[] tasks = new Task<string[]>[2];
String docsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
tasks[0] = Task<string[]>.Factory.StartNew( () => Directory.GetFiles(docsDirectory));
tasks[1] = Task<string[]>.Factory.StartNew( () => Directory.GetDirectories(docsDirectory));
Task.Factory.ContinueWhenAll(tasks, completedTasks => {
Console.WriteLine("{0} contains: ", docsDirectory);
Console.WriteLine(" {0} subdirectories", tasks[1].Result.Length);
Console.WriteLine(" {0} files", tasks[0].Result.Length);
} );
}
}
// The example displays output like the following:
// C:\Users\<username>\Documents contains:
// 24 subdirectories
// 16 files
Imports System.IO
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim tasks(1) As Task(Of String())
Dim docsDirectory As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
tasks(0) = Task(Of String()).Factory.StartNew( Function()Directory.GetFiles(docsDirectory) )
'' End Sub )
tasks(1) = Task(Of String()).Factory.StartNew( Function() Directory.GetDirectories(docsDirectory) )
'' End Sub )
Task.Factory.ContinueWhenAll(tasks, Sub(completedTasks)
Console.WriteLine("{0} contains: ", docsDirectory)
Console.WriteLine(" {0} subdirectories", tasks(1).Result.Length)
Console.WriteLine(" {0} files", tasks(0).Result.Length)
End Sub)
End Sub
End Module
' The example displays output like the following:
' C:\Users\<username>\Documents contains:
' 24 subdirectories
' 16 files
설명
.NET은 작업을 만들고 예약하기 위한 두 가지 팩터리를 제공합니다.
TaskFactory 만들고 개체를 만드는 Task Task<TResult> 클래스입니다.
TaskFactory<TResult> 개체를 만드는 Task<TResult> 클래스입니다.
클래스를 TaskFactory<TResult> 사용하면 다음을 수행할 수 있습니다.
작업을 만들고 메서드를 호출하여 즉시 시작합니다 StartNew . 이 메서드의 오버로드를 호출하여 기본이 아닌 인수가 필요한 작업을 만들고 실행할 수 있습니다.
경고
.NET Framework 4.5 Task.Run 부터 이 메서드는 기본 구성 값으로 작업을 만들고 즉시 시작하는 가장 쉬운 방법을 제공합니다.
배열의 태스크 중 하나가 완료된 경우 또는 ContinueWhenAny 메서드를 호출 ContinueWhenAny 하여 시작하는 작업을 만듭니다.
배열의 모든 작업이 완료된 경우 또는 ContinueWhenAll 메서드를 호출 ContinueWhenAll 하여 시작하는 작업을 만듭니다.
정적 Task<TResult>.Factory 속성은 기본 TaskFactory<TResult> 개체를 반환합니다. 클래스 생성자 중 TaskFactory<TResult> 하나를 호출하여 클래스가 만드는 개체를 Task<TResult> TaskFactory<TResult> 구성할 수도 있습니다. 다음 예제에서는 지정된 취소 토큰, 작업 만들기 옵션, 연속 옵션 및 사용자 지정된 작업 스케줄러가 있는 작업을 만들도록 새 TaskFactory<TResult> 개체를 구성합니다.
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
static CancellationTokenSource cts = new CancellationTokenSource();
static TaskFactory<int> factory = new TaskFactory<int>(
cts.Token,
TaskCreationOptions.PreferFairness,
TaskContinuationOptions.ExecuteSynchronously,
new CustomScheduler());
static void Main()
{
var t2 = factory.StartNew(() => DoWork());
cts.Dispose();
}
static int DoWork()
{
/*...*/
return DateTime.Now.Hour <= 12 ? 1 : 2;
}
}
Imports System.Collections.Generic
Imports System.Threading
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim cts As New CancellationTokenSource()
Dim factory As New TaskFactory(Of Integer)(
cts.Token,
TaskCreationOptions.PreferFairness,
TaskContinuationOptions.ExecuteSynchronously,
New CustomScheduler())
Dim t2 = factory.StartNew(Function() DoWork())
cts.Dispose()
End Sub
Function DoWork() As Integer
Return If(Date.Now.Hour <= 12, 1, 2)
End Function
End Module
대부분의 경우 새 TaskFactory<TResult> 인스턴스를 인스턴스화할 필요가 없습니다. 대신 기본값을 사용하는 팩터리 개체를 반환하는 정적 Task<TResult>.Factory 속성을 사용할 수 있습니다. 그런 다음 메서드를 호출하여 새 작업을 시작하거나 작업 연속 작업을 정의할 수 있습니다. 일러스트레이션은 예제를 참조하세요.
생성자
TaskFactory<TResult>() |
기본 구성을 사용하여 TaskFactory<TResult> 인스턴스를 초기화합니다. |
TaskFactory<TResult>(CancellationToken) |
기본 구성을 사용하여 TaskFactory<TResult> 인스턴스를 초기화합니다. |
TaskFactory<TResult>(CancellationToken, TaskCreationOptions, TaskContinuationOptions, TaskScheduler) |
지정된 구성을 사용하여 TaskFactory<TResult> 인스턴스를 초기화합니다. |
TaskFactory<TResult>(TaskCreationOptions, TaskContinuationOptions) |
지정된 구성을 사용하여 TaskFactory<TResult> 인스턴스를 초기화합니다. |
TaskFactory<TResult>(TaskScheduler) |
지정된 구성을 사용하여 TaskFactory<TResult> 인스턴스를 초기화합니다. |
속성
CancellationToken |
이 작업 팩터리에 대한 기본 취소 토큰을 가져옵니다. |
ContinuationOptions |
이 작업 팩터리에 대한 TaskContinuationOptions 열거형 값을 가져옵니다. |
CreationOptions |
이 작업 팩터리에 대한 TaskCreationOptions 열거형 값을 가져옵니다. |
Scheduler |
이 작업 팩터리에 대한 작업 스케줄러를 가져옵니다. |
메서드
적용 대상
스레드 보안
모든 공용 및 보호된 멤버 TaskFactory<TResult> 는 스레드로부터 안전하며 여러 스레드에서 동시에 사용할 수 있습니다.