Prawie cała dokumentacja, którą widziałem przy korzystaniu z C# 4.0 Task.Factory.StartNew stwierdza, że aby poczekać na zakończenie zadania, musisz poczekać. Ale moje wstępne testy pokazują, że jest to niepotrzebne. Czy ktoś inny może mi to potwierdzić? Ciekawi mnie, dlaczego tak wiele odniesień online i drukowanych mówi, że powinieneś zadzwonić do Wait.Czy funkcja Wait() jest konieczna po użyciu Task.Factory.StartNew()?
Oto prosta aplikacja konsolowa, która pokazuje, że nie potrzebuję oświadczenia Oczekiwanie, więc skomentowałem to. Niezależnie od tego, czy komentuję tsk.Wait(), dane wyjściowe są takie same.
Oczekiwana moc we wszystkich przypadkach jest następująca:
Main thread starting. After running MyTask. The result is True After running SumIt. The result is 1 Main thread ending.
Kod:
class Program
{
// A trivial method that returns a result and takes no arguments.
static bool MyTask()
{
Thread.Sleep(2000);
return true;
}
// This method returns the summation of a positive integer
// which is passed to it.
static int SumIt(object v)
{
int x = (int)v;
int sum = 0;
for (; x > 0; x--)
sum += x;
return sum;
}
static void Main(string[] args)
{
Console.WriteLine("Main thread starting.");
// Construct the first task.
Task<bool> tsk = Task<bool>.Factory.StartNew(() => MyTask());
// I found this Wait statement to be completely unnecessary.
//tsk.Wait();
Console.WriteLine("After running MyTask. The result is " +
tsk.Result);
// Construct the second task.
Task<int> tsk2 = Task<int>.Factory.StartNew(() => SumIt(1));
Console.WriteLine("After running SumIt. The result is " +
tsk2.Result);
tsk.Dispose();
tsk2.Dispose();
Console.WriteLine("Main thread ending.");
Console.ReadLine();
}
}
Dzięki, Timwi. Miałem bicie mózgu i nie zauważyłem, że używam Zadanie zamiast Zadanie. Teraz to ma sens! –
@tambui: jak oznaczyć to jako odpowiedź? – stackoverflowuser
@stackoverflowuser: Przepraszam, nie wiedziałem, jak to zrobić. Zrobione teraz. –