2013-06-08 20 views
22

bekliyoruz kullanarak bu iki form arasında herhangi bir fonksiyonel bir fark var mıTask.Factory.StartNew (() => Task.Start karşı bekliyor

  1. string x = await Task.Factory.StartNew(() => GetAnimal("feline")); 
    
  2. Task<string> myTask = new Task<string>(() => GetAnimal("feline")); 
    myTask.Start(); 
    string z = await myTask; 
    
?

Özel olarak, hangi sırayla 1. sırada çağrılır? StartNew çağrılır ve sonra beklenir veya 1. adıma ilk beklenir.

cevap

14

StartNew sadece bir short hand for creating and starting a task'dur. Başlamadan önce Task örneğine bir şeyler yapmak isterseniz, kurucuyu kullanın. Sadece görevi hemen oluşturmak ve başlatmak istiyorsanız, kısa el kullanın. StartNew çağrı yürütülmesi için görev zamanlamak için Task.Start yöntem arama daha sonra kurucular birini kullanarak bir görev oluşturma ve işlevsel olarak eşdeğer olan

: StartNew için

Belgeleri söylüyor.

+0

myTask.Start() öğesini çağırdıktan sonra, GetAnimal ("feline") hemen çağrılır, bu da Görev'i başlattığım için anlam ifade eder. Bu sayede birçok görev başlatabilirim ve sonra her bir görev için beklemek istediğime karar verebilir miyim? – user42

+0

@ user42: tabiki. (Ama ben başka bir iş parçacığı çağırmanın tamamen "anında" olduğunu söyleyemem.) – Vlad

-8

Fark yoktur. Aynı IL kodunu üretiyorlar.

+0

Hiç bir fark yok, ama onlar aynı IL'ı üretmiyorlar. – vcsjones

+5

Bu sadece yanlıştır. Bir Task.get_Factory' TaskFactory.StartNew' 'çağrı ardından ve diğer görev ' bir kurucu aramaları 'dönmesini IL üretir' Task.Start 'bir çağrı()' eklenmiştir. – svick

24

async ve await ile kod yazarken, mümkün olduğunda Task.Run kullanmalısınız.

Task yapıcısı (ve Task.Start), henüz başlatılmamış görevleri oluşturmak için kullanılan Görev Paralel Kitaplığı'nda bulunanlardır. Task yapıcısı ve Task.Start, async kodunda kullanılmamalıdır.

Benzer şekilde, TaskFactory.StartNew, async görevleri için en iyi varsayılanları kullanmayan ve async lambdas değerini anlamayan eski bir yöntemdir. Birkaç durumda yararlı olabilir, ancak Task.Run zamanının büyük çoğunluğu async kodu için daha iyidir.

+0

bu daha iyi bir yol mu? ... 'temsilci dize AnimalDelegate (string t);' 'AnimalDelegate a = new AnimalDelegate (GetAnimal);' 'var sonuç = Task.Run (() => {iade edilen bir ("kedi");}); beklemektedir ' – user42

+6

Sadece 'vari sonuç = bekle Task.Run (() => GetAnimal ("feline")); –

İlgili konular