TaskCompletionSource<TResult> 클래스
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
대리자의 바인딩되지 않은 Task<TResult> 생산자 쪽을 나타내며 Task 속성을 통해 소비자 쪽에 대한 액세스를 제공합니다.
generic <typename TResult>
public ref class TaskCompletionSource
public class TaskCompletionSource<TResult>
type TaskCompletionSource<'Result> = class
Public Class TaskCompletionSource(Of TResult)
형식 매개 변수
- TResult
이 TaskCompletionSource<TResult>연결된 결과 값의 형식입니다.
- 상속
-
TaskCompletionSource<TResult>
예제
다음 예제에서는 TaskCompletionSource<TResult>사용하는 방법을 보여줍니다.
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
class TCSDemo
{
// Demonstrated features:
// TaskCompletionSource ctor()
// TaskCompletionSource.SetResult()
// TaskCompletionSource.SetException()
// Task.Result
// Expected results:
// The attempt to get t1.Result blocks for ~1000ms until tcs1 gets signaled. 15 is printed out.
// The attempt to get t2.Result blocks for ~1000ms until tcs2 gets signaled. An exception is printed out.
static void Main()
{
TaskCompletionSource<int> tcs1 = new TaskCompletionSource<int>();
Task<int> t1 = tcs1.Task;
// Start a background task that will complete tcs1.Task
Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
tcs1.SetResult(15);
});
// The attempt to get the result of t1 blocks the current thread until the completion source gets signaled.
// It should be a wait of ~1000 ms.
Stopwatch sw = Stopwatch.StartNew();
int result = t1.Result;
sw.Stop();
Console.WriteLine("(ElapsedTime={0}): t1.Result={1} (expected 15) ", sw.ElapsedMilliseconds, result);
// ------------------------------------------------------------------
// Alternatively, an exception can be manually set on a TaskCompletionSource.Task
TaskCompletionSource<int> tcs2 = new TaskCompletionSource<int>();
Task<int> t2 = tcs2.Task;
// Start a background Task that will complete tcs2.Task with an exception
Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
tcs2.SetException(new InvalidOperationException("SIMULATED EXCEPTION"));
});
// The attempt to get the result of t2 blocks the current thread until the completion source gets signaled with either a result or an exception.
// In either case it should be a wait of ~1000 ms.
sw = Stopwatch.StartNew();
try
{
result = t2.Result;
Console.WriteLine("t2.Result succeeded. THIS WAS NOT EXPECTED.");
}
catch (AggregateException e)
{
Console.Write("(ElapsedTime={0}): ", sw.ElapsedMilliseconds);
Console.WriteLine("The following exceptions have been thrown by t2.Result: (THIS WAS EXPECTED)");
for (int j = 0; j < e.InnerExceptions.Count; j++)
{
Console.WriteLine("\n-------------------------------------------------\n{0}", e.InnerExceptions[j].ToString());
}
}
}
}
Imports System.Diagnostics
Imports System.Threading
Imports System.Threading.Tasks
Module TCSDemo
' Demonstrated features:
' TaskCompletionSource ctor()
' TaskCompletionSource.SetResult()
' TaskCompletionSource.SetException()
' Task.Result
' Expected results:
' The attempt to get t1.Result blocks for ~1000ms until tcs1 gets signaled. 15 is printed out.
' The attempt to get t2.Result blocks for ~1000ms until tcs2 gets signaled. An exception is printed out.
Private Sub Main()
Dim tcs1 As New TaskCompletionSource(Of Integer)()
Dim t1 As Task(Of Integer) = tcs1.Task
' Start a background task that will complete tcs1.Task
Task.Factory.StartNew(Sub()
Thread.Sleep(1000)
tcs1.SetResult(15)
End Sub)
' The attempt to get the result of t1 blocks the current thread until the completion source gets signaled.
' It should be a wait of ~1000 ms.
Dim sw As Stopwatch = Stopwatch.StartNew()
Dim result As Integer = t1.Result
sw.Stop()
Console.WriteLine("(ElapsedTime={0}): t1.Result={1} (expected 15) ", sw.ElapsedMilliseconds, result)
' ------------------------------------------------------------------
' Alternatively, an exception can be manually set on a TaskCompletionSource.Task
Dim tcs2 As New TaskCompletionSource(Of Integer)()
Dim t2 As Task(Of Integer) = tcs2.Task
' Start a background Task that will complete tcs2.Task with an exception
Task.Factory.StartNew(Sub()
Thread.Sleep(1000)
tcs2.SetException(New InvalidOperationException("SIMULATED EXCEPTION"))
End Sub)
' The attempt to get the result of t2 blocks the current thread until the completion source gets signaled with either a result or an exception.
' In either case it should be a wait of ~1000 ms.
sw = Stopwatch.StartNew()
Try
result = t2.Result
Console.WriteLine("t2.Result succeeded. THIS WAS NOT EXPECTED.")
Catch e As AggregateException
Console.Write("(ElapsedTime={0}): ", sw.ElapsedMilliseconds)
Console.WriteLine("The following exceptions have been thrown by t2.Result: (THIS WAS EXPECTED)")
For j As Integer = 0 To e.InnerExceptions.Count - 1
Console.WriteLine(vbLf & "-------------------------------------------------" & vbLf & "{0}", e.InnerExceptions(j).ToString())
Next
End Try
End Sub
End Module
설명
대부분의 시나리오에서는 Task<TResult> 외부 비동기 작업을 나타낼 수 있도록 설정하는 것이 유용합니다. 이 목적을 위해 TaskCompletionSource<TResult> 제공됩니다. 이를 통해 소비자에게 전달될 수 있는 작업을 만들 수 있습니다. 소비자는 태스크 멤버 변수를 처리하는 다른 시나리오와 동일한 방식으로 태스크의 멤버를 사용할 수 있습니다. 그러나 대부분의 작업과 달리 TaskCompletionSource에서 만든 작업의 상태는 TaskCompletionSource의 메서드에 의해 명시적으로 제어됩니다. 이렇게 하면 외부 비동기 작업의 완료가 기본 작업으로 전파될 수 있습니다. 또한 분리를 통해 소비자는 해당 TaskCompletionSource에 액세스하지 않고 상태를 전환할 수 없습니다. 자세한 내용은 .NET을 사용한 병렬 프로그래밍 블로그의 TaskCompletionSource
병렬 확장 샘플에는 TaskCompletionSource<TResult>사용하는 방법에 대한 예제도 포함되어.
생성자
TaskCompletionSource<TResult>() | |
TaskCompletionSource<TResult>(Object) |
지정된 상태를 사용하여 TaskCompletionSource<TResult> 만듭니다. |
TaskCompletionSource<TResult>(Object, TaskCreationOptions) |
지정된 상태 및 옵션을 사용하여 TaskCompletionSource<TResult> 만듭니다. |
TaskCompletionSource<TResult>(TaskCreationOptions) |
지정된 옵션을 사용하여 TaskCompletionSource<TResult> 만듭니다. |
속성
Task |
이 TaskCompletionSource<TResult>만든 Task<TResult> 가져옵니다. |
메서드
적용 대상
스레드 보안
TaskCompletionSource<TResult> 모든 멤버는 스레드로부터 안전하며 여러 스레드에서 동시에 사용할 수 있습니다.
추가 정보
- 다른 비동기 패턴 TPL 사용
- 방법: 작업 EAP 패턴 래핑
.NET