TaskExtensions.Unwrap 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
오버로드
Unwrap(Task<Task>) |
|
Unwrap<TResult>(Task<Task<TResult>>) |
|
Unwrap(Task<Task>)
Task<Task>
(C#) 또는 Task (Of Task)
(Visual Basic)의 비동기 작업을 나타내는 프록시 Task를 만듭니다.
public:
[System::Runtime::CompilerServices::Extension]
static System::Threading::Tasks::Task ^ Unwrap(System::Threading::Tasks::Task<System::Threading::Tasks::Task ^> ^ task);
public static System.Threading.Tasks.Task Unwrap (this System.Threading.Tasks.Task<System.Threading.Tasks.Task> task);
static member Unwrap : System.Threading.Tasks.Task<System.Threading.Tasks.Task> -> System.Threading.Tasks.Task
<Extension()>
Public Function Unwrap (task As Task(Of Task)) As Task
매개 변수
반환
제공된 System.Threading.Tasks.Task(Of Task)
의 비동기 작업을 나타내는 작업입니다.
예외
task
인수가 null인 경우 throw되는 예외입니다.
예제
다음 예제에서는 태스크 래이프를 해제하는 방법을 보여줍니다.
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
class UnWrapDemo
{
// Demonstrated features:
// Task.Unwrap()
// Task.Factory.StartNew()
// Task.ContinueWith()
// Expected results:
// Indicates that continuation chains can be set up virtually instantaneously using Unwrap(), and then left to run on their own.
// The results of the RemoteIncrement(0) chain and the RemoteIncrement(4) chain may be intermixed with each other.
// The results of the sequence that starts with RemoteIncrement(4) are in strict order.
// Documentation:
// http://msdn.microsoft.com/library/dd781129(VS.100).aspx
// More information:
// http://blogs.msdn.com/pfxteam/archive/2009/11/04/9917581.aspx
// Other notes:
// The combination of Task<T>, ContinueWith() and Unwrap() can be particularly useful for setting up a chain of long-running
// tasks where each task uses the results of its predecessor.
static void Main()
{
// Invoking individual tasks is straightforward
Task<int> t1 = RemoteIncrement(0);
Console.WriteLine("Started RemoteIncrement(0)");
// Chain together the results of (simulated) remote operations.
// The use of Unwrap() instead of .Result below prevents this thread from blocking while setting up this continuation chain.
Task<int> t2 = RemoteIncrement(4)
.ContinueWith(t => RemoteIncrement(t.Result)) // RemoteIncrement() returns Task<int> so no unwrapping is needed for the first continuation.
.Unwrap().ContinueWith(t => RemoteIncrement(t.Result)) // ContinueWith() returns Task<Task<int>>. Therefore unwrapping is needed.
.Unwrap().ContinueWith(t => RemoteIncrement(t.Result)) // and on it goes...
.Unwrap();
Console.WriteLine("Started RemoteIncrement(...(RemoteIncrement(RemoteIncrement(4))...)");
try
{
t1.Wait();
Console.WriteLine("Finished RemoteIncrement(0)\n");
t2.Wait();
Console.WriteLine("Finished RemoteIncrement(...(RemoteIncrement(RemoteIncrement(4))...)");
}
catch (AggregateException e)
{
Console.WriteLine("A task has thrown the following (unexpected) exception:\n{0}", e);
}
}
// This method represents a remote API.
static Task<int> RemoteIncrement(int n)
{
return Task<int>.Factory.StartNew(
(obj) =>
{
// Simulate a slow operation
Thread.Sleep(1 * 1000);
int x = (int)obj;
Console.WriteLine("Thread={0}, Next={1}", Thread.CurrentThread.ManagedThreadId, ++x);
return x;
},
n);
}
}
Imports System.Threading
Imports System.Threading.Tasks
Module UnwrapDemo
' Demonstrated features:
' Task.Unwrap()
' Task.Factory.StartNew()
' Task.ContinueWith()
' Expected results:
' Indicates that continuation chains can be set up virtually instantaneously using Unwrap(), and then left to run on their own.
' The results of the RemoteIncrement(0) chain and the RemoteIncrement(4) chain may be intermixed with each other.
' The results of the sequence that starts with RemoteIncrement(4) are in strict order.
' Documentation:
' http://msdn.microsoft.com/library/dd781129(VS.100).aspx
' More information:
' http://blogs.msdn.com/pfxteam/archive/2009/11/04/9917581.aspx
' Other notes:
' The combination of Task<T>, ContinueWith() and Unwrap() can be particularly useful for setting up a chain of long-running
' tasks where each task uses the results of its predecessor.
Sub Main()
' Invoking individual tasks is straightforward
Dim t1 As Task(Of Integer) = RemoteIncrement(0)
Console.WriteLine("Started RemoteIncrement(0)")
' Chain together the results of (simulated) remote operations.
' The use of Unwrap() instead of .Result below prevents this thread from blocking while setting up this continuation chain.
' RemoteIncrement() returns Task<int> so no unwrapping is needed for the first continuation.
' ContinueWith() here returns Task<Task<int>>. Therefore unwrapping is needed.
' and on it goes...
Dim t2 As Task(Of Integer) = RemoteIncrement(4).ContinueWith(Function(t) RemoteIncrement(t.Result)).Unwrap().ContinueWith(Function(t) RemoteIncrement(t.Result)).Unwrap().ContinueWith(Function(t) RemoteIncrement(t.Result)).Unwrap()
Console.WriteLine("Started RemoteIncrement(...(RemoteIncrement(RemoteIncrement(4))...)")
Try
t1.Wait()
Console.WriteLine("Finished RemoteIncrement(0)" & vbLf)
t2.Wait()
Console.WriteLine("Finished RemoteIncrement(...(RemoteIncrement(RemoteIncrement(4))...)")
Catch e As AggregateException
Console.WriteLine("A task has thrown the following (unexpected) exception:" & vbLf & "{0}", e)
End Try
End Sub
' This method represents a remote API.
Function RemoteIncrement(ByVal n As Integer) As Task(Of Integer)
Return Task(Of Integer).Factory.StartNew(Function(obj)
' Simulate a slow operation
Thread.Sleep(1 * 1000)
Dim x As Integer = CInt(obj)
Console.WriteLine("Thread={0}, Next={1}", Thread.CurrentThread.ManagedThreadId, System.Threading.Interlocked.Increment(x))
Return x
End Function, n)
End Function
End Module
설명
내부 태스크가 외부Task<TResult>의 일부로 수행된 작업을 나타내는 작업에서 Task<TResult>작업을 반환할 수 있는 경우가 많습니다. 그러나 이렇게 Task<Task>
하면 (C#) 또는 Task (Of Task)
(Visual Basic)가 발생하며, 신중하게 처리하지 않으면 예기치 않은 동작이 발생할 수 있습니다. 래프 해제는 이러한 작업의 전체 비동기 작업을 나타내는 프록시 작업을 만들어 이 문제를 해결합니다.
추가 정보
적용 대상
Unwrap<TResult>(Task<Task<TResult>>)
Task<Task<T>>
(C#) 또는 Task (Of Task(Of T))
(Visual Basic)의 비동기 작업을 나타내는 프록시 Task를 만듭니다.
public:
generic <typename TResult>
[System::Runtime::CompilerServices::Extension]
static System::Threading::Tasks::Task<TResult> ^ Unwrap(System::Threading::Tasks::Task<System::Threading::Tasks::Task<TResult> ^> ^ task);
public static System.Threading.Tasks.Task<TResult> Unwrap<TResult> (this System.Threading.Tasks.Task<System.Threading.Tasks.Task<TResult>> task);
static member Unwrap : System.Threading.Tasks.Task<System.Threading.Tasks.Task<'Result>> -> System.Threading.Tasks.Task<'Result>
<Extension()>
Public Function Unwrap(Of TResult) (task As Task(Of Task(Of TResult))) As Task(Of TResult)
형식 매개 변수
- TResult
작업 결과의 형식입니다.
매개 변수
반환
제공된 Task<Task<T>>
(C#) 또는 Task (Of Task(Of T))
(Visual Basic)의 비동기 작업을 나타내는 Task입니다.
예외
task
인수가 null인 경우 throw되는 예외입니다.
설명
내부 Task 가 외부Task의 일부로 수행된 작업을 나타내는 위치에서 Task반환 Task 할 수 있는 것이 유용한 경우가 많습니다. 그러나 이렇게 Task<Task<T>>
하면 (C#) 또는 Task (Of Task(Of T))
(Visual Basic)가 발생하며, 신중하게 처리하지 않으면 예기치 않은 동작이 발생할 수 있습니다. 래핑 해제는 이러한 (C#) 또는 Task (Of Task(Of T))
(Visual Basic)의 전체 비동기 작업을 나타내는 프록시 Task<TResult> 를 Task<Task<T>>
만들어 이 문제를 해결합니다.