Görevler arka plan konuları olarak mı oluşturuluyor?


86

Dot.net 4'teki yeni Görev sınıfının bir arka plan mı yoksa ön plan iş parçacığı mı oluşturduğunu merak ediyorum.

Normalde bir İş Parçacığında "IsBackground" ayarlıyordum, ancak bir Görevde böyle bir öznitelik yok.

MSDN'de bununla ilgili herhangi bir belge bulamadım :-(

Yanıtlar:


120

Doğrulamak zor olmamalı:

class Program
{
    static void Main()
    {
        Task
            .Factory
            .StartNew(() => Console.WriteLine(Thread.CurrentThread.IsBackground))
            .Wait();
    }
}

Ve cevap ...

ǝnɹʇ


Tüm görevlerimin çağrı iş parçacığında çalıştığı bir sorun yaşıyorum. Yukarıdaki kod satırını projeme yapıştırdım ve "yanlış" olarak bildiriyor. Bunun neden olabileceğini biliyor musunuz? .NET 4.0 kullanıyorum.
Trevor Elliott

8
Bu iş parçacığına göre stackoverflow.com/questions/7889746/… bir göreve başlarken arka plan iş parçacığı garanti edilmez, ancak TaskCreationOptions.LongRunning kullanıyorsanız öyle olmalısınız. Bu seçeneği kullanıyorum ve hala bir arka plan dizisi oluşturmuyor. Ne oluyor?
Trevor Elliott

yapılmayacak şekilde yapılandırılabilir mi?
Royi Namir

2
Moozhe'nin probleminin varsayılan senkronizasyon bağlamında olabileceğine inanıyorum. Davranış, bir WinForms, WPF, Web veya Konsol uygulamasında olup olmadığınıza bağlı olarak farklı olabilir, çünkü hepsinin eşzamanlı görevleri zamanlamanın farklı varsayılan yolları vardır.
jpierson

5
cevabınızı sevdim: "ǝnɹʇ". Çok eğlenceli. Teşekkür ederim.
teddy

12

Task<T>Kullanmaya başlıyorsanız Task.Run(), evet.

Eğer kullanıyorsanız asyncve awaitardından hayır. Buradan alıntı :

"Eşzamansız ve await anahtar sözcükleri, ek iş parçacığı oluşturulmasına neden olmaz. Eşzamansız yöntemler, eşzamansız bir yöntem kendi iş parçacığı üzerinde çalışmadığı için çoklu okuma gerektirmez. Yöntem, geçerli eşitleme bağlamında çalışır ve iş parçacığı üzerinde zamanı kullanır yalnızca yöntem etkin olduğunda. CPU'ya bağlı çalışmayı arka plan iş parçacığına taşımak için Task.Run'ı kullanabilirsiniz, ancak arka plan iş parçacığı, yalnızca sonuçların kullanılabilir olmasını bekleyen bir işleme yardımcı olmaz. "


1
Task.Run kullandığınız için arka plan iş parçacığı üzerinde olacaktır, ancak bir bekleme süresine ulaşırsa, iş parçacığını duraklatmak ve sonuçları beklemek için özel bir şey yapabilir. Araştırmaya değer.
Steztric


0

Görevler, sistem iş parçacığı havuzundan gelen evreler tarafından yürütülür. İş parçacığı havuzundan gelen bir iş parçacığı, varsayılan olarak arka planda yürütülür.


-1

Henüz bir arka plan görevine ikna olmadıysanız, aşağıdaki gibi bir GUI öğesine bir Görev içinden erişmeye çalışın:

public async Task<int> ProcessStuff_Async()
{
    while(true)
    {
        label1.Text = "processing next item";

çalışma zamanı istisnasını almak için:

Çapraz iş parçacığı işlemi geçerli değil: 'etiket1' denetimine oluşturulduğu iş parçacığı dışındaki bir iş parçacığından erişildi.

tıpkı eski güzel arka plan dizilerindeki gibi.

MSDN belgelerinde bilgi var (2017 itibariyle :-), örneğin:

Bunu halletmenin en iyi yolu ... bir başlamaktır arka plan iş parçacığı kullanarak çalışır Task.Run ve bekliyor onun sonucunu. Bu, kullanıcı arayüzünün iş yapılırken pürüzsüz hissetmesini sağlayacaktır.

Bu belgenin bir bölümü bile var What happens under the covers.


Sizin denetiminiz yalnızca görevin kendi iş parçacığında çalıştığını doğrular, iş parçacığının bir arka plan iş parçacığı olduğunu değil. Arka plan iş parçacığı, hala yürütülüyorsa programın sonlanmasını engellemeyen bir iş parçacığıdır.
Sören Kuklau
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.