2011-12-21 12 views
6

Aşağıdaki kod neden çalışmaz anlayamıyorum:Neden boş bir .NET Görev başlatıldı ve statik bir kurucu için bekledikten sonra tamamlanmaz?

var task = new Task(() => { }); 
task.Start(); 
if (task.Wait(10000)) 
{ 
    logger.Info("Works"); 
} 
else 
{ 
    logger.Info("Doesn't work"); 
} 

görev durum zaman aşımı süresi dolduktan sonra "Running" durumunda kalıyor, yapılacak bir şey olsa. Ancak task.Start()'un task.RunSynchronously() ile değiştirilmesi işe yarayacaktır.

Neyin yanlış yaptığına dair bir fikrim var mı?

Sorunu çoğaltmak için bir test projesi şu anda kullanılabilir: http://erwinmayer.com/dl/TaskTestProject.zip. Görebildiğim kadarıyla, yukarıdaki kod ile yöntem statik yapıcı içinde çalışırsa çalışmaz. Ancak, doğrudan bir statik sınıf yöntemi olarak adlandırılırsa çalışır. O inşaat http://blogs.msdn.com/b/pfxteam/archive/2011/05/03/10159682.aspx

+0

.. – MethodMan

+1

@DJ KRAZE: Görev, TPL'nin temel sınıflarından biridir. Bkz. Http://msdn.microsoft.com/en-us/library/dd460717.aspx –

+0

Bu kodun herhangi bir harici değişkene veya işlevine (istediğiniz günlük kaydı işleviyle değiştirilebilen genel günlük kaydı işlevi dışında) ihtiyacı yoktur. –

cevap

1

Yorumlarınız için herkese teşekkür ederiz, daha spesifik olmamı sağladı ve sonunda sorunu yalıtdı.

Burada bir test projesi oluşturdum: http://erwinmayer.com/dl/TaskTestProject.zip. Sorgundaki kodun statik yapıcıda çalışırsa çalışmadığını gösterir. Ancak statik kurucu başlatıldıktan sonra doğrudan statik bir sınıf yöntemi olarak adlandırılırsa çalışır. çoklu ve statik kurucular ile uğraşırken

This recent MSDN blog post

ilgili konuların varlığına bazı teknik bilgiler sağlar: Bu hangi yöntemi bu yürütülmektedir tanımlanan sahip tam kod bloğu gönderebilir

+0

Artık ne olduğuna dair yeterince mutlu muyum, cevabımda detaylara girmeme değmez mi? (Eğer öyleyse, onu da silebilirim.) Aksi takdirde, ne olup bittiğini adım adım ve neler olup bittiğini bir çıkmaz neden olur. –

+0

Genel fikri kavradım; Şimdi, statik kurucuda çoklu iş parçacığı kullanırken CLR'nin kilitler nasıl oluşturduğunu biliyorsanız, bu iş parçacığını okuyacak insanlar için çok anlayışlı olabileceğine inanıyorum. –

+0

Uygulama ayrıntılarını bilmiyorum, sadece gözlemlenen davranış açısından garanti edilen şey. –

0

:

 var task = new Task(() => { }); 
     task.Start(); 
     if (task.Wait(10000)) 
     { 
      Console.WriteLine("yes"); 
     } 
     else 
     { 
      Console.WriteLine("no"); 
     } 

Ve beklendiği gibi çıktı yes verir

Bu son MSDN blog yazısı

statik kurucular ile ilgili konularda vurgulamak gibi görünüyor. Çalışmamaya neden olan başka bir şey yapmalısınız. Verilen formda, neyi/nerede yaptığınızı bağlamlamadan çalışır.

Hatta bu iğrençtir çalışır:

 var task = new Task(() => 
           { 

            var task1 = new Task(() => 
                  { 
                  }); 
            task1.Start(); 
            if (task1.Wait(10000)) 
            { 
             Console.WriteLine("yes"); 
            } 
            else 
            { 
             Console.WriteLine("no"); 
            } 

           }); 
     task.Start(); 
     if (task.Wait(10000)) 
     { 
      Console.WriteLine("yes"); 
     } 
     else 
     { 
      Console.WriteLine("no"); 
     } 
+0

Burada bir test projesi yükledim: db.tt/fRopKi76 –

10

bağlam burada çok önemlidir. Böyle bir görevi başlattığınızda, geçerli zamanlayıcıyı kullanır - ve eğer geçerli iş parçacığını kullanabileceğini varsayarsa, beklediğinizde etkin bir şekilde kilitleneceksiniz.

Aynı kod farklı bağlamda iyi olurdu.

Diğerleri bunun için çalıştıklarını söylüyor, ancak bu sizin için çalışmıyor, başka bir bağlamda bu kodu başka bir bağlamda çalıştırdığınızdan şüphelenmiyorsunuz - ama bize kısa bir görüntü vermediniz ancak Bu snippet'i programında tamamlayın, böylece herkes farklı bir şekilde çoğaltmaya çalışıyor. (Şimdiye kadar daha fazla ışık tutamayacak bir proje yüklediğinizi görüyorum. Soruya gönderilebilecek kısa ama eksiksiz bir program, elbette ki genellikle tercih edilir.)

+3

1000'den fazla böcek öldü, Jon Skeet doğdu ve hala ölüyorlar ... –

+0

Burada bir test projesi yükledim: http: // db. tt/fRopKi76 –

+0

Jon, ya seni yanlış anladım ya da beynin osurdu. Muhtemelen eski, ama ilk paranız bana yanlış okuyor. Sınırlı deneyimim var, ama söylediğin şeyin mantıklı olduğu herhangi bir durumu bilmiyorum. Varsayılan zamanlayıcıyı kullanarak bir görevi başlattığınızda winform'larda, kullanıcı arabiriminde kesinlikle çalışmaz. –

İlgili konular