2010-02-15 3 views
8

.NET bilgimden, bir BackgroundWorker kullanırsam ve RunWorkerCompleted için bir olay işleyicisine sahip olursam olay işleyicisi, RunWorkerAsync'in çağrıldığı aynı iş parçacığı üzerinde çalışır. Bunun yerine, bir eşzamanlı olmayan bir yöntemi çalıştırmak için bir temsilci üzerinde BeginInvoke kullanın ve bir AsyncCallback parametresini BeginInvoke'a geçirin, herhangi bir isteğe bağlı iş parçacığı için BeginInvoke adında aynı iş parçacığı üzerinde çalışmayı belirtmek için herhangi bir yol var mı? Anlayışımdan itibaren geri arama, iş parçacığı havuzundan bir sonraki kullanılabilir iş parçacığında çalışır. Bu iyi, ama istediğim herhangi bir iş parçacığında bir AsyncCallback kod çalıştırabilir miyim? BeginInvoke'u bir formda veya denetimde kullanabileceğinizi ve UI öğesini oluşturan iş parçacığı üzerinde geri arama çalıştırması içinde kod yazabildiğinizi biliyorum. Ancak, herhangi bir form veya denetim içermeyen bir UI olmayan iş parçacığı üzerinde kod çalıştırmak istiyorsam ne dersiniz?Delege.BeginInvoke kullanırken AsyncCallback'in çalıştığı iş parçacığı belirtebilir mi?

cevap

6

Eşzamansız işleminiz için hedef olarak kullanmak istediğiniz iş parçacığı üzerinde, CurrentDispatcher Mülk, bir iş parçacığının bu iş parçacığı üzerinde yürütülmesini zorlamak için kullanılabilecek bir System.Threading.Dispatcher nesnesidir.

Bu, Control sınıfının BeginInvoke uygulamasını uygulamak için kullandığı temel sınıftır.

Bunu Windows formları ile kullanmak hakkında sorularınız oluştu. Bunun bir sorun olacağını düşünmüyorum, ancak bir formunuz varsa, form.BeginInvoke daha iyi bir seçimdir. Görünüşe göre, hem form hem de WPF, invoke işlemek için aynı temel sınıfı kullanır. http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx

+0

+1 ... – IAbstract

+0

System.Windows.Threading.Dispatcher WPF özeldir ve yok Bir Delegate.BeginInvoke AsyncCallback çağrılan iş parçacığı ile ilgili bir şey. –

+1

@Jeff: geri aramanın hedeflenmesine izin vermek için alternatif bir BeginInvoke yöntemi sağlar. Anlayabildiğim kadarıyla, bu gerçekten istediği şey ve soruyu sorarken terminolojisini bir araya getirdi. –

0

İş parçacığı her zaman bir iş parçacığı havuzu iş parçacığı olacaktır ve hiçbir zaman bir UI iş parçacığı olmayacaktır.

BTW, C#, BackgroundWorker sınıfına sahip değildir. .NET yapar.

+0

Teşekkürler. BackgroundWorker'ın C#'ye özgü olduğunu ima etmek istemedim. Onu çıkardım. – YWE

0

Ben bir arama yaptım ve ben Jon Skeet's site bitti. İş parçacığının eşzamanlı olmayan delegeler ve geri çağrılarla nasıl çalıştığı hakkında çok bilgilendirici. Bu okuma tavsiye ederim.

5

Delegate.BeginInvoke, temsilci her zaman ThreadPool içinde yürütecek ve temsilci tarafından yürütülen aynı iş parçacığında AsyncCallback çağrılır.

Sizin tek seçenek özel iş parçacığı üzerinde geri yeniden çağırmak için geçerli: CurrentDispatcher özelliği için

AsyncCallback = delegate (IAsyncResult ar) 
{ 
    wathever.BeginInvoke(delegate 
    { 
     // Do your stuff... 
    }; 
}; 
+0

AsyncCallback'in BeginInvoke adlı aynı iş parçacığında çağrıldığı anlamına mı geliyor? Bu, "Eşzamansız Yöntemleri Eşzamansız Olarak Çağırmak" başlıklı MSDN dökümantasyon makalesinden (http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx) anladığım şeye ters geliyor. Eşzamansız çağrının sonuçları işleyen iş parçacığı olması gerekmez, çağrı tamamlandığında geri arama yöntemini çalıştırabilirsiniz. " – YWE

+4

Hayır, demek istediğim, Delegate.BeginInvoke iş parçacığı A, bu temsilci ThreadPool bir B iş parçacığı üzerinde yürütülür ve daha sonra AsyncCallback B iş parçacığı üzerinde denir. –

+1

Doğru. Sadece doğruladım. MSDN belgelerinde bunu netleştirdiklerini sanmıyorum. – YWE