Görev ve iş parçacığı arasındaki fark nedir?


378

C # 4.0 sürümündeTask , System.Threading.Tasks ad alanında var. Arasındaki gerçek fark nedir Threadve Task. Kendi öğrenme uğrum için bazı örnek program (MSDN'den alınan yardım) yaptım

Parallel.Invoke 
Parallel.For 
Parallel.ForEach 

ama fikir çok açık olmadığı için birçok şüpheniz var.

Başlangıçta benzer bir tür soru için Stackoverflow aradım ama bu soru başlığı ile ben aynı alamadım olabilir. Burada daha önce gönderilen aynı türden soruları bilen biri varsa, lütfen bağlantının referansını verin.


8
konuları çalıştırmak görevleri
pm100

Yanıtlar:


314

Görev yapmak istediğiniz bir şeydir.

İş parçacığı, bu görevi yerine getiren olası birçok işçiden biridir.

.NET 4.0 terimlerinde, Görev zaman uyumsuz bir işlemi temsil eder. İplik (ler), işi parçalara ayırarak ve ayrı dişlere atayarak bu işlemi tamamlamak için kullanılır.


Bir görevi tamamlamak için çalışan konulara temel bir örnek verebilir misiniz? İş parçacıklarının birbirinden bağımsız iş yapıp yapmadığını bilmiyor muyum yoksa ekip çalışması hesaplaması yapıyorlar mı?
pensum

Her iki senaryo da mümkündür: en uygun durumda, iş parçacıkları diğer iş parçacıkları ile senkronizasyona gerek kalmadan bağımsız işler yaparlar. Uygulamada, dişleri koordine etmek için kilitler kullanılır.
Mitch Wheat

451

Bilgisayar bilimi açısından, a Taskbir gelecek ya da bir vaattir . (Bazı insanlar bu iki terimi eşzamanlı olarak kullanır, bazıları farklı kullanır, kimse kesin bir tanım üzerinde anlaşamaz .) Temel olarak, Task<T>size geri dönme sözü verir T, ama şu anda değil tatlım, neden biraz meşgulüm sonra geri mi geleceksin?

A Threadbu sözü yerine getirmenin bir yoludur. Ancak her Taskbirinin yepyeni bir şeye ihtiyacı yoktur Thread. (Aslında, bir iş parçacığı oluşturmak genellikle istenmeyen bir durumdur, çünkü bunu yapmak iş parçacığındaki mevcut bir iş parçacığını yeniden kullanmaktan çok daha pahalıdır. Bir an için daha fazlası.) Beklediğiniz değer dosya sisteminden veya veritabanına veya ağa bağlanırsa, bir iş parçacığının oturup diğer isteklere hizmet edebileceği durumlarda verileri beklemesine gerek kalmaz. Bunun yerine, Taskhazır olduklarında değerleri almak için bir geri arama kaydedebilir.

Özellikle, Taskyok değil demek niye buna değer döndürmek için bu kadar uzun bir zaman almasıdır. Bu belki de hesaplamak için uzun bir zaman alır olmayabilir ya buna getirmek için uzun zaman alır olabilir. Yalnızca önceki durumda a'yı Threadçalıştırmak için a kullanırsınız Task. (.NET'te, iş parçacıkları pahalıdır, bu nedenle genellikle mümkün olduğunca kaçınmak ve bunları yalnızca birden çok CPU'da birden fazla ağır hesaplama çalıştırmak istiyorsanız kullanın. Örneğin, Windows'ta bir iş parçacığı 12 KiByte ( Sanırım), Linux'ta bir iplik 4 KiByte kadar ağır, Erlang / BEAM'de sadece 400 Byte bile. .NET'te 1 MiByte!)


29
İlginç bir şekilde, TPL'nin (Görev Paralel Kütüphanesi) ilk önizleme sürümlerinde Görev ve Gelecek <T> vardı. Gelecek <T> daha sonra Görev <T> olarak yeniden adlandırıldı. :)
Lee Campbell

23
.NET için 1 MB'ı nasıl hesapladınız?
dvallejo

5
@DanVallejo: Bu sayı, TPL tasarım ekibiyle yapılan bir röportajda belirtildi. Sana kimin söylediğini ya da hangi röportaj olduğunu söyleyemem, yıllar önce izledim.
Jörg W Mittag

9
@RIPUNJAYTRIPATHI Tabii, ama başka bir iş parçacığı olmak zorunda değil , ilk etapta iş isteyen iş parçacığı olabilir.
Chris Pitman

7
.NET yalnızca Windows'ta Windows iş parçacıklarını kullanır, bu nedenle boyut aynıdır - varsayılan olarak, her ikisi için genellikle 1 MiB sanal bellek. Fiziksel bellek, yerel kodla aynı olan sayfa boyutundaki parçalarda (genellikle 64 kiB) gerektiği gibi kullanılır. Minimum iplik yığını boyutu, örneğin Vista için OS - 256 kiB'ye bağlıdır. X86 Linux'ta, varsayılan değer genellikle 2 MiB'dir - yine sayfa boyutunda parçalar halinde ayrılmıştır. (basitleştirme) Erlang, işlem başına yalnızca bir sistem iş parçacığı kullanır, bu 400 bayt .NET'lere benzer bir şey anlamına gelir Task.
Luaan

39

Konu

Çıplak metal şey, muhtemelen kullanmanıza gerek yoktur, muhtemelen bir LongRunninggörev kullanabilir ve .NET Framework 4'te (Şubat 2002) ve üzeri (ayrıca .NET'te yer alan TPL - Görev Paralel Kütüphanesi'nden yararlanabilirsiniz) Çekirdek).

Görevler

İpliklerin üzerinde soyutlama. İş parçacığı havuzunu kullanır (görevi bir LongRunningişlem olarak belirtmediğiniz sürece, sizin için başlık altında yeni bir iş parçacığı oluşturulur).

İş Parçacığı Havuzu

Adından da anlaşılacağı gibi: bir iş parçacığı havuzu. .NET framework sizin için sınırlı sayıda iş parçacığı işliyor. Neden? Çünkü sadece 8 çekirdekli bir İşlemcide pahalı CPU işlemleri gerçekleştirmek için 100 iş parçacığı açmak kesinlikle iyi bir fikir değildir. Çerçeve, bu havuzu sizin için koruyacak, iş parçacıklarını yeniden kullanmayacak (her işlemde onları oluşturmayacak / öldürmeyecek) ve bazılarını CPU'nuz yanmayacak şekilde paralel olarak çalıştıracaktır.

Tamam, ama her biri ne zaman kullanılır?

Özgeçmişte: her zaman görevleri kullan.

Görev bir soyutlamadır, bu yüzden kullanımı çok daha kolaydır. Her zaman görevleri kullanmaya çalışmanızı öneririm ve bir iş parçacığını kendiniz (muhtemelen% 1 zaman) işlemenizi gerektiren bir sorunla karşılaşırsanız, iş parçacıkları kullanın.

AMA şunu unutmayın:

  • G / Ç Sınırı : G / Ç bağlantılı işlemler için (veritabanı çağrıları, okuma / yazma dosyaları, API çağrıları vb.) Normal görevleri kullanmaktan kaçının, LongRunninggörevleri ( veya gerekiyorsa iş parçacıklarını ) kullanın. Çünkü görevleri kullanmak sizi birkaç iş parçacığı meşgul bir iş parçacığı havuzuna ve havuza girme sırasını bekleyen başka birçok göreve yönlendirir.
  • CPU Bağlı : CPU bağlantılı işlemler için normal görevleri (dahili olarak iş parçacığı havuzunu kullanır) kullanın ve mutlu olun.

hafif düzeltme, bir Konu "çıplak metal bir şey" değildir. İşletim sistemi tarafından uygulanır, çoğu uygulama CPU ve CS özelliklerine aktarılır, ancak donanım tarafından uygulanmaz.
Tomer W

7

Ne Taskyapmak istediğinizi belirtmek için kullanın ve ardından bunu Taska ile ekleyin Thread. böylece GUI iş parçacığı yerine Taskyeni yapılan bu yürütülür Thread.

Kullanım Taskile TaskFactory.StartNew(Action action). Burada herhangi bir iş parçacığı kullanmadıysanız aynı iş parçacığında (GUI iş parçacığı) yürütülecek bir temsilci yürütmek. Bir iş parçacığından bahsederseniz, bunu Taskfarklı bir iş parçacığında yürütebilirsiniz . Bu, temsilciyi doğrudan yürütebileceğiniz veya bu temsilciyi bir iş parçacığına ekleyebileceğiniz ve o iş parçacığında o temsilciyi çalıştırabileceğiniz gereksiz bir çalışma nedenidir. Yani kullanma. bu sadece gereksiz. Yazılımınızı optimize etmek istiyorsanız, bu kaldırılacak iyi bir adaydır.

** unutmayınız Actionbir olduğunu delegate.


6

Yukarıdaki noktalara ek olarak, aşağıdakileri bilmek iyi olur:

  1. Görev varsayılan olarak bir arka plan görevidir. Ön plan göreviniz olamaz. Öte yandan bir iş parçacığı arka plan veya ön plan olabilir (davranışı değiştirmek için IsBackground özelliğini kullanın).
  2. İş parçacığı havuzunda oluşturulan görevler, kaynakların kurtarılmasına yardımcı olan iş parçacıklarını geri dönüştürür. Bu nedenle çoğu durumda görevler varsayılan seçiminiz olmalıdır.
  3. İşlemler hızlıysa, iş parçacığı yerine bir görev kullanmak çok daha iyidir. Uzun süren işlemler için, görevler iş parçacıklarına göre fazla avantaj sağlamaz.

4

Genellikle Taskkullanıcı arayüzünü dondurmamak için Winforms ve basit arka plan çalışanı ile etkileşime giriyorum. kullanmayı tercih ettiğimde bir örnekTask

private async void buttonDownload_Click(object sender, EventArgs e)
{
    buttonDownload.Enabled = false;
    await Task.Run(() => {
        using (var client = new WebClient())
        {
            client.DownloadFile("http://example.com/file.mpeg", "file.mpeg");
        }
    })
    buttonDownload.Enabled = true;
}

VS

private void buttonDownload_Click(object sender, EventArgs e)
{
    buttonDownload.Enabled = false;
    Thread t = new Thread(() =>
    {
        using (var client = new WebClient())
        {
            client.DownloadFile("http://example.com/file.mpeg", "file.mpeg");
        }
        this.Invoke((MethodInvoker)delegate()
        {
            buttonDownload.Enabled = true;
        });
    });
    t.IsBackground = true;
    t.Start();
}

fark, MethodInvokerdaha kısa kod kullanmanıza gerek olmamasıdır .


4

Görev yapmak istediğiniz bir işlem gibidir, Thread bu işlemi birden çok işlem düğümü üzerinden yönetmeye yardımcı olur. Görev hafif bir seçenektir Diş açma karmaşık bir kod yönetimine neden olabilir
MSDN (dünyanın en iyisi) her zaman Görev önerecektir

Konu


3

Görev, bir şeyi eşzamansız ve paralel olarak yürütmenin kolay ve kolay bir yolu olarak görülebilir.

Normalde bir Görev ihtiyacınız olan tek şey, deneme dışında başka bir şey için bir iplik kullandığımı hatırlamıyorum.

Bir görevle yapabildiğiniz gibi bir iş parçacığıyla (çok fazla çaba ile) aynı şeyi yapabilirsiniz.

Konu

int result = 0;
Thread thread = new System.Threading.Thread(() => { 
    result = 1; 
});
thread.Start();
thread.Join();
Console.WriteLine(result); //is 1

Görev

int result = await Task.Run(() => {
    return 1; 
});
Console.WriteLine(result); //is 1

Bir görev, varsayılan olarak iş parçacığı oluşturmak pahalı olabileceğinden kaynakları kaydeden Threadpool'u kullanır. Görevi, iş parçacıkları üzerinde daha üst düzey bir soyutlama olarak görebilirsiniz.

Bu makalede belirtildiği gibi , görev iş parçacığı üzerinde aşağıdaki güçlü özellikleri sağlar.

  • Çok çekirdekli işlemcilerden faydalanmak için görevler ayarlanır.

  • Sistemin birden fazla görevi varsa, CLR iş parçacığı havuzunu dahili olarak kullanır ve bu nedenle iş parçacığının, İş parçacığını kullanarak özel bir iş parçacığı oluşturma ile ilişkili olması gerekmez. Ayrıca birden çok iş parçacığı arasındaki bağlam değiştirme süresini de azaltın.

  • Görev bir sonuç döndürebilir.
  • Sinyal oluşturma yapısı olmadan bir dizi görevi bekleyin.

  • Birbiri ardına yürütmek için görevleri bir araya getirebiliriz.

  • Bir görev başka bir görevden başlatıldığında bir üst / alt ilişkisi oluşturun.

  • Alt görev istisnası üst göreve yayılabilir.

  • İptal belirteçleri kullanarak görev desteği iptali.

  • 'Eşzamansız' ve 'bekliyor' anahtar kelimeleri kullanarak eşzamansız uygulama kolaydır.

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.