2012-01-24 20 views
5

TPL ile .NET 4'ü kullanarak, geleceğe yönelik API'lerin nasıl tasarlanacağına karar vermeye çalışıyorum. Bana zaman uyumsuz desen taklit etmekti aklına ama bir End(IAsyncResult) yöntemi olmadan Bir olasılık: Bu itibarlaBu TPL deyim var mı?

public Task<int> BeginGetAge() 
{ 
    // create and return task 
} 

public int GetAge() 
{ 
    return this.BeginGetAge().Result; 
} 

arayanlar engelleme veya GetAge() sürümünü engellenmeyen aramaya karar verebilir. Üstelik, geleceğe erişimleri vardır, bununla birlikte, bunun üzerine devam edebilirler.

Bu deyim geçerli mi? Eksik olduğum belirgin dezavantajlar veya problemler var mı? Belki resmi bir ismi var mı? Bir Task dönersek

+0

İkinci vakanız, 'beklemeden' büyük yarar sağlayacaktır. – user7116

+0

FYI, Stephen Toub bunu yayınladı (uyumsuz yöntemler için eş zamanlı sarmalayıcılar sunuluyor) - tl; dr bundan kaçının :) bkz. Http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638. aspx ve ayrıca http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx –

cevap

3

yeni C 5. async yoludur - TAP deniyor: Task-based Asynchronous Pattern. Tek fark, yöntemin GetAgeAsync olarak adlandırılmış olmasıdır.

Yani, evet - bu yaklaşım, serbest bırakıldığında C# 5 uyumsuzluğuna geçiş yapmasını kolaylaştıracağı için önerilir.

+0

Çok yardımcı bir referans - teşekkürler. –

2

Bu deyim benim için tamamen geçerli gibi görünüyor ve aslında Task tabanlı asenkronizasyon desteği .Net'in yeni sürümlerinde büyük bir özellik olacak.

Ancak, uygulamanızı değiştiririm, böylece GetAge engelleme yöntemi, async yöntemini çağırmaz ve ardından bekler - ek yük (muhtemelen) yeni bir iş parçacığı oluşturmak gereksizdir.

+0

Yöntemler arasındaki ilişkiyi takas edebilir ve 'BeginGetAge()' return 'Görev .Factory.StartNew (() => GetAge())' olabilir. –

+0

@SeanU Kesin olarak. –

+1

Eh, varolan bir iş parçacığına geçiş yapmak için yeni bir iş parçacığı oluşturacağını sanmıyorum. Ve hatta o zaman, bunun gerekli olup olmadığına karar vermek programlayıcıya kalmış. Ama ben senin dikkatini çekiyorum ve Sean'ın önerisi mantıklı. –