TaskCompletionSource<TResult> Sınıf
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Temsilciye bağlı olmayan bir Task<TResult> üretici tarafını temsil eder ve Task özelliği aracılığıyla tüketici tarafına erişim sağlar.
generic <typename TResult>
public ref class TaskCompletionSource
public class TaskCompletionSource<TResult>
type TaskCompletionSource<'Result> = class
Public Class TaskCompletionSource(Of TResult)
Tür Parametreleri
- TResult
Bu TaskCompletionSource<TResult>ile ilişkili sonuç değerinin türü.
- Devralma
-
TaskCompletionSource<TResult>
Örnekler
Aşağıdaki örnekte bir TaskCompletionSource<TResult>nasıl kullanılacağı gösterilmektedir:
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
Açıklamalar
Birçok senaryoda, Task<TResult> bir dış zaman uyumsuz işlemi temsil etmek için etkinleştirmek yararlıdır. bu amaçla TaskCompletionSource<TResult> sağlanır. Tüketicilere dağıtılabilir bir görev oluşturulmasını sağlar. Tüketiciler, görev üyelerini diğer senaryo işleme görev üyesi değişkenlerinde olduğu gibi kullanabilir. Ancak çoğu görevin aksine, TaskCompletionSource tarafından oluşturulan bir görevin durumu, TaskCompletionSource üzerindeki yöntemler tarafından açıkça denetlenmektedir. Bu, dış zaman uyumsuz işlemin tamamlanmasının temel Alınan Göreve yayılmasını sağlar. Ayrım, tüketicilerin ilgili TaskCompletionSource'a erişim olmadan durumu geçirememesini de sağlar. Daha fazla bilgi için .NET ile Paralel Programlama blogunda The Nature of TaskCompletionSource
Paralel Uzantılar örnekleriTaskCompletionSource<TResult>nasıl kullanılacağına ilişkin örnekler de içerir.
Oluşturucular
TaskCompletionSource<TResult>() |
TaskCompletionSource<TResult>oluşturur. |
TaskCompletionSource<TResult>(Object) |
Belirtilen duruma sahip bir TaskCompletionSource<TResult> oluşturur. |
TaskCompletionSource<TResult>(Object, TaskCreationOptions) |
Belirtilen durum ve seçeneklerle bir TaskCompletionSource<TResult> oluşturur. |
TaskCompletionSource<TResult>(TaskCreationOptions) |
Belirtilen seçeneklerle bir TaskCompletionSource<TResult> oluşturur. |
Özellikler
Task |
Bu TaskCompletionSource<TResult>tarafından oluşturulan Task<TResult> alır. |
Yöntemler
Equals(Object) |
Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler. (Devralındığı yer: Object) |
GetHashCode() |
Varsayılan karma işlevi işlevi görür. (Devralındığı yer: Object) |
GetType() |
Geçerli örneğin Type alır. (Devralındığı yer: Object) |
MemberwiseClone() |
Geçerli Objectbasit bir kopyasını oluşturur. (Devralındığı yer: Object) |
SetCanceled() |
Temel Task<TResult>Canceled durumuna geçirmektedir. |
SetCanceled(CancellationToken) |
Belirtilen belirteci kullanarak temel Task<TResult>Canceled durumuna geçirilir. |
SetException(Exception) |
Temel Task<TResult>Faulted durumuna geçirip belirtilen özel duruma bağlar. |
SetException(IEnumerable<Exception>) |
Temel alınan Task<TResult>Faulted durumuna geçirip özel durum nesneleri koleksiyonunu ona bağlar. |
SetFromTask(Task<TResult>) |
Temel Task<TResult> belirtilen |
SetResult(TResult) |
Temel Task<TResult>RanToCompletion durumuna geçirmektedir. |
ToString() |
Geçerli nesneyi temsil eden bir dize döndürür. (Devralındığı yer: Object) |
TrySetCanceled() |
Temel Task<TResult>Canceled durumuna geçmeyi dener. |
TrySetCanceled(CancellationToken) |
Temel Task<TResult>Canceled durumuna geçirmeyi dener ve iptal edilen görevde bir iptal belirtecinin depolanmasını sağlar. |
TrySetException(Exception) |
Temel alınan Task<TResult>Faulted durumuna geçmeyi dener ve bunu belirtilen özel duruma bağlar. |
TrySetException(IEnumerable<Exception>) |
Temel alınan Task<TResult>Faulted durumuna geçmeyi dener ve özel durum nesneleri koleksiyonunu buna bağlar. |
TrySetFromTask(Task<TResult>) |
Temel Task<TResult> belirtilen |
TrySetResult(TResult) |
Temel Task<TResult>RanToCompletion durumuna geçmeyi dener. |
Şunlara uygulanır
İş Parçacığı Güvenliği
TaskCompletionSource<TResult> tüm üyeleri iş parçacığı açısından güvenlidir ve aynı anda birden çok iş parçacığından kullanılabilir.
Ayrıca bkz.
- TPL'nin Diğer Zaman Uyumsuz Desenlerle
- Nasıl Yapılır: Görev EAP Desenlerini Sarmalama