TaskExtensions.Unwrap Método
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Sobrecargas
Unwrap(Task<Task>) |
Cria um proxy Task que representa a operação assíncrona de um |
Unwrap<TResult>(Task<Task<TResult>>) |
Cria um proxy Task que representa a operação assíncrona de um |
Unwrap(Task<Task>)
- Origem:
- TaskExtensions.cs
- Origem:
- TaskExtensions.cs
- Origem:
- TaskExtensions.cs
Cria um proxy Task que representa a operação assíncrona de um Task<Task>
(C#) ou Task (Of Task)
(Visual Basic).
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
Parâmetros
Retornos
Uma tarefa que representa a operação assíncrona do System.Threading.Tasks.Task(Of Task)
fornecido.
Exceções
A exceção lançada se o argumento task
for nulo.
Exemplos
O exemplo a seguir mostra como desembrulhar uma tarefa:
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
Comentários
Geralmente, é útil poder retornar uma Tarefa de um Task<TResult>, em que a Tarefa interna representa o trabalho feito como parte do externo Task<TResult>. No entanto, isso resulta em um Task<Task>
(C#) ou Task (Of Task)
(Visual Basic), que, se não for tratado com cuidado, pode produzir um comportamento inesperado. Desembrulhar resolve esse problema criando uma Tarefa proxy que representa toda a operação assíncrona de tal tarefa.
Confira também
- Biblioteca de tarefas paralelas (TPL)
- Programação assíncrona baseada em tarefas
- Como: Desencapsular uma tarefa aninhada
Aplica-se a
Unwrap<TResult>(Task<Task<TResult>>)
- Origem:
- TaskExtensions.cs
- Origem:
- TaskExtensions.cs
- Origem:
- TaskExtensions.cs
Cria um proxy Task que representa a operação assíncrona de um Task<Task<T>>
(C#) ou Task (Of Task(Of T))
(Visual Basic).
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)
Parâmetros de tipo
- TResult
O tipo de resultado da tarefa.
Parâmetros
O Task<Task<T>>
(C#) ou Task (Of Task(Of T))
(Visual Basic) a ser descompactado.
Retornos
Um Task que representa a operação assíncrona do Task<Task<T>>
(C#) ou Task (Of Task(Of T))
(Visual Basic) fornecido.
Exceções
A exceção lançada se o argumento task
for nulo.
Comentários
Geralmente, é útil poder retornar um Task de um Task, em que a parte interna Task representa o trabalho feito como parte do externo Task. No entanto, isso resulta em um Task<Task<T>>
(C#) ou Task (Of Task(Of T))
(Visual Basic), que, se não for tratado com cuidado, pode produzir um comportamento inesperado. Desembrulhar resolve esse problema criando um proxy Task<TResult> que representa toda a operação assíncrona de um Task<Task<T>>
(C#) ou Task (Of Task(Of T))
(Visual Basic).
Confira também
- Biblioteca de tarefas paralelas (TPL)
- Programação assíncrona baseada em tarefas
- Como: Desencapsular uma tarefa aninhada