2009-06-02 19 views

cevap

0

Modelinize bağlı olarak, çalışanınızın iş parçacığını, işini bitirdiğinde içerik oluşturucusuna (veya başka bir işlemin) geri çağırmasını istersiniz ya da iş parçacığını her seferinde sık sık sorgulamanız gerekir. bitti ve eğer öyleyse, sonucu alın.

Bir iş parçacığının sonucunu döndürmesini beklemek fikri, çok iş parçacığının yararlarını zayıflatır.

1

RunWorkerAsync() işlemi zaman uyumsuz olarak başlatır ve işlem gerçekten tamamlanmadan önce kodunuzu yürütmeye devam eder ve devam eder. BackgroundWorker sonucunu elde etmek istiyorsanız, o değeri basılı tutmak için bir örnek değişkeni oluşturmanız ve BackgroundWorker tamamlandığında kontrol etmeniz gerekir.

İş bitene kadar beklemek isterseniz, BackgroundWorker'a ihtiyacınız yoktur.

Sen parçacığı bağımsız değişken olarak nesne ile bir etkinlik yükseltmek olabilir
+1

için

onay bunu bekleyiş ve bunu yaparken UI_ kadar _locking arasında bir fark var. –

+0

@TSar: Bu, “BackgroundWorker” gibi eski bir bileşenle çalışmanın bağlamında, “bekletme” nin semantiklerinin başarılması nispeten karmaşık olsa da (veya en azından “bekletme” şeklini göstermek için) doğrudur. Böyle bir şey şimdi 'async' ve 'bekliyor' sözdizimi ile ifade etmek çok daha kolay ve geliştirici 'BackgroundWorker' için tamamen kullanım durumları ile tamamen uzaklaşmasına izin verir. –

+0

Ardından, OP'nize BackgroundWorker'ı kullanmadığını söylemek yerine, cevabınızı alternatiflerle tamamlamanız iyi olur. Şimdi okuduğu gibi, herhangi bir çok iş parçacığı kullanmamanızı önerirsiniz - bu işlem bitene kadar uygulamayı kilitler. –

1

:

ThreadFinishedEvent(this, new ThreadEventArgs(object)); 

burada: Ben Engellemek ve beklemek istemiyorsanız varsayarak yaşıyorum

public class ThreadEventArgs : EventArgs 
{ 
    public ThreadEventArgs(object object) 
    { 
     Object = object 
    } 

    public object Object 
    { 
     get; private set; 
    } 
} 
18

Sonuçlar için RunWorkerAsync() (eğer yaptıysanız, async çalıştırmak için bir neden olmazdı!

Arka plan işlemi bittiğinde bilgilendirilmek istiyorsanız, RunWorkerCompleted Event'i kancalayın. Bir eyaleti geri getirmek, DoWork'un etkinlik arşivlerinin Sonuç üyesine geri dönmek istiyorum.

DÜZENLEME: zamanından önce yayınlanmıştır -

Örnek benim kod örneği tamamladı: (arka plan çalışması gerçekleştiği yerde olan)

BackgroundWorker için DoWork Olay işleyicisi
 


    private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     // do your thing 
     .... 
     // return results 
     e.Result = theResultObject; 
    } 

    // now get your results 
    private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     MyResultObject result = (MyResultObject)e.Result; 
     // process your result... 
    } 

 
87

var Bir argüman DoWorkEventArgs. Bu nesnenin bir public property nesnesi var. İşçiniz sonucunu oluşturduğunda (sizin durumunuzda, bir List<FileInfo>), buna e.Result ayarlayın ve geri dönün.

Şimdi BackgroundWorker görevini tamamladıktan sonra, bir RunWorkerCompletedEventArgs nesnesini argüman olarak içeren RunWorkerCompleted olayını tetikler. RunWorkerCompletedEventArgs.Result, BackgroundWorker ürününüzün sonucunu içerir.

örnek: bir işlem zaman uyumsuz çalıştırırken Genel olarak

private void bgw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    int result = 2+2; 
    e.Result = result; 
} 

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    int result = (int)e.Result; 
    MessageBox.Show("Result received: " + result.ToString()); 
} 
+0

Bahhh teşekkürler! – ganjeii

0

, iş parçacığı temsilci aramak gerekir ya da (ChrisF gibi) bir olayı.

Değerleri döndürebilen bazı eşzamanlı işlevlere sahip olan yeni PFX'e göz atabilirsiniz. Örneğin, bir değer döndürebilen bir aşırı yüklenmeye sahip Parallel.ForEach() adında bir işlev vardır.daha fazla bilgi

http://msdn.microsoft.com/en-us/magazine/cc817396.aspx