24 Aralık 2014 Çarşamba

Task Parallel Library - TaskCompletionSource

TaskCompletionSource
Bu sınıf'ın en çok eski async metoduları Task arayüzüne adapte etmek amacıyla kullanılıyor.

Sınıf kendi içinde bir Task ihtiva eder. TaskCompletionSource nesnesinin SetResult() metodu çağırılınca, içerdiği Task'ın Task.Finish() metodu çağırılır.

Klasik kullanım örnekleri şöyle:
GUI kodunda asynch/await çok kullanılır. Böylece uzun süre işlerde GUI'nin donması engellenir. Uzun süre bir işi arkada thread ile çalıştırmak için klasik örnek

private TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
tcs.Thread.Start(...);
// complete task in event
tcs.SetResult(true);

// wait for task somewhere else
await tcs.Task;
Sadece bekleyen Task
Task.Delay() metodu .Net 4.0 ile geliyor. Eğer elimizde yoksa, Timer sınıfını Task arayüzüne uyarlamak için şöyle yapabiliriz.

public static class TaskExtensions
{
    public static Task Delay(this Task task, TimeSpan timeSpan)
    {
        var tcs = new TaskCompletionSource<bool>();
        System.Timers.Timer timer = new System.Timers.Timer();
        timer.Elapsed += (obj, args) =>
        {
            tcs.TrySetResult(true);
        };
        timer.Interval = timeSpan.Milliseconds;
        timer.AutoReset = false;
        timer.Start();
        return tcs.Task;
    } 
}

Klasik kullanımı dışında tuhaf kullanım şekilleri:

Async olarak tasarlanmış bir arayüzü, sync hale getirmek
Task<Bar> CreateBarAsync()
 {
    var tcs = new TaskCompletionSource<Bar>();
    tcs.SetResult(SynchronousBarCreator());
    return tcs.Task
 }

Hiç yorum yok:

Yorum Gönder