.NET 4.0 ma licencję OC, która zawiera ładną klasę zadań do enkapsulacji asynchronicznych modeli programowania. Pracuję nad aplikacją, która musi być .NET 2.0, ale chcę uniknąć zadania przepisywania. Jakieś sugestie?Co należy zrobić, aby użyć zadania <T> w .NET 2.0?
Odpowiedz
Wiem, mówiłeś, że nie chcą przepisać zadanie, ale możesz faktycznie stworzyć coś całkiem prostego za pomocą zamknięć, które zachowują się trochę jak obiekt Zadanie. To właśnie używam.
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;
}
};
}
Jest to funkcja, która zwraca BeginInvoke() na delegata Ci przepustkę i zwraca funkcję, która po nazwie bloki i czeka na wynik funkcji przeszedł w wy mieliście trzeba oczywiście tworzyć przeciążenia tej funkcji dla różnych metod.
Jednym ze sposobów na przejście, możesz dostosować to do swoich potrzeb i dodać inne zachowania, takie jak Kontynuacje itp. Kluczem jest użycie zamknięć i anonimowych delegatów. Powinien pracować w .NET 2.0.
EDIT - Oto jak można go używać:
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
}
Będziesz musiał użyć System.Threading.Thread
klasę, można uzyskać klasę Task
dla .NET 3.5, ale nie dla .NET 2.
Niestety
Byłem pod wrażeniem, że klasa Zadanie pochodzi z .NET 4. Jak mogę używać go pod 3.5? –
Zespół [Rx] (http://go.microsoft.com/fwlink/?LinkID=179929) przesłał 'Task' i inne abstrakcje niskiego poziomu (ale nie całą TPL) do .NET 3.5 SP1. –
@Christial Schwarz, ^^ jak powiedział Stephen, został przeniesiony. – Jethro
Dzięki Sean. To dobry punkt wyjścia. –
Dla każdego, kto przejdzie przez kod, należy zauważyć, że BeginInvoke, jak użyto powyżej, uruchamia HelloWorld w [nowym wątku z zarządzanej puli wątków] (http://stackoverflow.com/questions/3556634/does-funct-begininvoke-use-the-threadpool). – rkagerer