SORU
18 EKİM 2009, Pazar


Nasıl parçacığı ile bitirmek için bekleyin .NET?

İki iş parçacığı için gereken hiç bir iş parçacığı daha önce C kullandım ben# gibi ana UI iş parçacığı. Temelde şu var.

public void StartTheActions()
{
  //Starting thread 1....
  Thread t1 = new Thread(new ThreadStart(action1));
  t1.Start();

  // Now, I want for the main thread (which is calling `StartTheActions` method) 
  // to wait for `t1` to finish. I've created an event in `action1` for this. 
  // The I wish `t2` to start...

  Thread t2 = new Thread(new ThreadStart(action2));
  t2.Start();
}

Yani, aslında, benim sorum bitirmek için başka bir iş parçacığı bir bekleyiş var. Bunu yapmak için en iyi yolu nedir?

CEVAP
9 ŞUBAT 2010, Salı


5 seçenekleri görebilirsiniz:

1. İplik.Katılın

Mitch'in cevap olarak. Ama bu bir zaman Aşımı için yerleşik olarak bulunur, ancak UI iş parçacığı engeller.


2. WaitHandle kullanın

ManualResetEvent WaitHandle bir jrista önerdi.

Unutulmaması gereken bir şey varsa, birden çok iş parçacığı bir MTA iş parçacığı ihtiyacı olarak varsayılan olarak işe yaramaz bekleyin isterseniz. MTAThread - ancak bu bloklar Mesajınızı pompa ile Main() işaretleme yöntemi ile bu sorunun üstesinden gelmek ve okuduğum kadarıyla tavsiye edilmez.


3. Bir olayı harekete

this page by Jon Skeet ilgili olaylar ve çoklu bakın, olay if EventName(this,EventArgs.Empty) - bana daha önce de oldu bu arasında unsuscribed hale gelebilir.

(Bu derleme umarım, denemedim)

public class Form1 : Form
{
    int _count;

    void ButtonClick(object sender, EventArgs e)
    {
        ThreadWorker worker = new ThreadWorker();
        worker.ThreadDone  = HandleThreadDone;

        Thread thread1 = new Thread(worker.Run);
        thread1.Start();

        _count = 1;
    }

    void HandleThreadDone(object sender, EventArgs e)
    {
        // You should get the idea this is just an example
        if (_count == 1)
        {
            ThreadWorker worker = new ThreadWorker();
            worker.ThreadDone  = HandleThreadDone;

            Thread thread2 = new Thread(worker.Run);
            thread2.Start();

            _count  ;
        }
    }

    class ThreadWorker
    {
        public event EventHandler ThreadDone;

        public void Run()
        {
            // Do a task

            if (ThreadDone != null)
                ThreadDone(this, EventArgs.Empty);
        }
    }
}

4. Bir temsilci

public class Form1 : Form
{
    int _count;

    void ButtonClick(object sender, EventArgs e)
    {
        ThreadWorker worker = new ThreadWorker(HandleThreadDone);

        Thread thread1 = new Thread(worker.Run);
        thread1.Start();

        _count = 1;
    }

    void HandleThreadDone()
    {
        // As before - just a simple example
        if (_count == 1)
        {
            ThreadWorker worker = new ThreadWorker();

            Thread thread2 = new Thread(worker.Run);
            thread2.Start(HandleThreadDone);

            _count  ;
        }
    }

    class ThreadWorker
    {
        // Switch to your favourite Action<T> or Func<T>
        public void Run(object state)
        {
            // Do a task

            Action completeAction = (Action)state;
            completeAction.Invoke();
        }
    }
}

Eğer _count yöntemi kullanırsanız, bir fikir olabilir (güvenli) kullanarak artırmak

Interlocked.Increment(ref _count)

İş parçacığı bildirim için kullanan delegeler ve olaylar arasındaki farkı bilmek isterim, bildiğim tek fark eşzamanlı olarak adlandırılan olaylar vardır.


5. Zaman uyumsuz olarak yerine yap

this question cevabını bu yöntem ile seçenekleri çok net bir açıklaması vardır.


Yanlış konuyu Olayları temsilci

İşleri olay/temsilci şekilde olay işleyicisi anlamına gelecektiryöntemüzerinde thread1/thread2ana kullanıcı arabirimi iş parçacığı değilçok doğru HandleThreadDone yöntemleri üst: geri geçiş yapmak gerekir

// Delegate example
if (InvokeRequired)
{
    Invoke(new Action(HandleThreadDone));
    return;
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Saquet

    Caroline Saq

    1 EKİM 2011
  • John Lynn

    John Lynn

    8 Ocak 2010
  • TWiT Netcast Network

    TWiT Netcast

    27 EKİM 2005