.NET 4.0, aynisel programlama modellerini kapsüllemek için güzel Görev sınıfını içeren TPL'ye sahiptir. .NET 2.0 olması gereken bir uygulama üzerinde çalışıyorum, ancak yeniden yazma görevinden kaçınmak istiyorum. Baska öneri?.NET 2.0 Görev <T>'u ne için kullanmalıyım?
cevap
2.
Maalesef .net için ben size Görevi yeniden yazmak istemiyorum söyledi biliyorum ama Aslında bir Görev nesnesi gibi davranan kapaklar kullanarak oldukça basit bir şey yaratabilirsiniz. .
public delegate R AsyncTask<R>();
public static AsyncTask<R> BeginTask<R>(AsyncTask<R> function)
{
R retv = default(R);
bool completed = false;
object sync = new object();
IAsyncResult asyncResult = function.BeginInvoke(
iAsyncResult =>
{
lock (sync)
{
completed = true;
retv = function.EndInvoke(iAsyncResult);
Monitor.Pulse(sync);
}
}, null);
return delegate
{
lock (sync)
{
if (!completed)
{
Monitor.Wait(sync);
}
return retv;
}
};
}
Onun içinde geçmesi temsilci üzerinde BeginInvoke() çağırır ve blokları denilen ve geçirilen fonksiyonun sonucu için bekleyeceği bir işlevi döndüren bir fonksiyon Sen ediyorum: Bu benim kullandığım budur Tabii ki, farklı yöntem imzaları için bu fonksiyonun aşırı yüklenmesini oluşturmak zorunda.
Gitmenin bir yolu, bunu gereksinimlerinize göre ayarlayabilir ve Devamlar vb. Gibi başka davranışlar da ekleyebilirsiniz. Anahtar, kapatma ve anonim temsilciler kullanmaktır. .NET 2.0 çalışmalıdır.
DÜZENLEME - Burada kullanmak görecektir:
public static string HelloWorld()
{
return "Hello World!";
}
static void Main(string[] args)
{
var task = BeginTask(HelloWorld); // non-blocking call
string result = task(); // block and wait
}
System.Threading.Thread
sınıfını kullanmak zorunda olacak
, sen .net 3.5 için Task
sınıfını alabilirsiniz ama
Ben Görev sınıf I 3.5 altında kullanabiliriz nasıl .NET 4. ile geliyor izlenim oldu? –
[Rx] (http://go.microsoft.com/fwlink/?LinkID=179929) ekibi, .NET 3.5 SP1'e "Task" ve diğer düşük düzeyli soyutlamaları (tüm TPL'yi değil) destekledi. –
@Christial Schwarz,^^^Stephen'ın söylediği gibi, geri verildi. – Jethro
Teşekkürler Sean. Bu iyi bir başlangıç noktasıdır. –
Kodda yürürlüğe giren herkes için, yukarıda kullanıldığı şekliyle BeginInvoke, [işlenen yönetilen iş parçacığından yeni bir iş parçacığı] üzerinde HelloWorld'ü başlattığını unutmayın (http://stackoverflow.com/questions/3556634/does-funct-begininvoke-use-the-threadpool). – rkagerer