2016-03-26 45 views
0

Programımda sorun nedir? Bir yürütme iş parçacığını kullanıcı arabiriminden ayıramıyorum. İş parçacığının yürütülmesi sırasında UI'ye erişilemez.UI'dan ayrı iş parçacığı

İlk seçenek:

// on button click: 
this.CreateImageList(); 

private void CreateImageList() 
{ 
    this.images.Clear(); 

    ThreadStart threadStart = delegate 
    { 
     this.dispatcher.BeginInvoke(new ThreadStart(delegate 
     { 
      foreach (var filePath in this.fileBuffer) 
      { 
       var result = new ImageObject(filePath); 
       if (result.Image != null) 
       { 
        this.images.Add(result); 
        this.dispatcher.Invoke(() => this.StatusText = filePath, DispatcherPriority.Render); 
       } 
      } 

      this.RaisePropertyChanged("Images"); 
     })); 
    }; 

    var thread = new Thread(threadStart); 
    thread.IsBackground = true; 
    thread.Start(); 
} 

İkinci seçenek: İlk olarak

// on button click: 
this.CreateImageList(); 

private async void CreateImageList() 
{ 
    await this.CreateImageListAsync(); 
} 

private async Task CreateImageListAsync() 
{ 
    this.images.Clear(); 
    var countTotal = this.fileBuffer.Count(); 
    var index = 0; 

    await Task.Run(() => this.dispatcher.Invoke(
    (() => 
    { 
     foreach (var filePath in this.fileBuffer) 
     { 
      var result = new ImageObject(filePath); 
      if (result.Image != null) 
      { 
       this.images.Add(result); 

       var percent = (index * 100)/countTotal; 
       this.DoForce(() => this.StatusText = percent + "% " + filePath); 
      } 

      index++; 
     } 

     this.RaisePropertyChanged("Images"); 
    }), DispatcherPriority.SystemIdle)); 
} 

public void DoForce(Action action) 
{ 
    this.dispatcher.Invoke(DispatcherPriority.Render, action); 
} 

ve program işi ikinci seçenekte

Bu benim ViewModel olduğunu. Ama birinci ve ikinci seçenekte ise UI nasıl olsa (duyarlı olmayan UI ile sonuçlanan) UI iş parçacığı üzerinde çalışacağı UI memuru üzerinde temsilci koyarak olmasıdır Kullanıcı

+0

Aldığınız hatalar nelerdir veya "erişilemiyor" aslında nasıl görünüyor? Lütfen gördüğünüz şeylerin bir yorumunu değil, doğru bir hata gözlemi sağlayın! –

+3

Bunun nedeni, UI işleyicisine kendisini her zaman UI iş parçacığına geri yükleyen temsilci koymanızdır. UI dağıtıcısı üzerinde yalnızca UI görevlerini devretmeniz gerekir, dinlenme arka plan iş parçacığı üzerinde çalıştırılabilir. –

+0

Hata yok! Program iyi çalışıyor! Ama pencereyi hareket ettiremiyorum ya da herhangi bir tuşa tıklayın ... – peter70

cevap

4

için ulaşılamıyor.

Yalnızca temsilci vermelisiniz UI dağıtıcısı üzerindeki UI görevleri, geri kalanı arka plan iş parçacığı üzerinde çalıştırılabilir.

+3

çalıştırıyorsanız, async/await desenini ya da yalnızca 'Görev ' türünü kullanmanız en iyisidir. Teşekkür ederim! – peter70

0

Bir arka plan veya UI iş parçacığı, ana iş parçacığına (ProgressChanged dışında) erişimi olmayan ayrı iş parçacıklarının olduğu izlenim altındayım. Bu soruna çok zaman harcadım ve ana iş parçacığına ikincil bir iş parçacığından kalıcı olarak erişmenin bir yolunu bulamadım.

UI iş parçacığı için çözümüm, genişletilmiş (lParam) değerleriyle ve/veya kayıt defteri değerleriyle uyumlu olarak iş parçacıkları arasında sohbet etmek için WndProc kullanıyordu.

Arka plandaki çalışan iş parçacığıyla, ana iş parçacığına bir pencere özellik işaretçisi aracılığıyla ilerleme olayındaki ana iş parçacığına eriştim. Ana iş parçacığına yalnızca BgWorker içindeki ProgressChanged olayından erişebilirsiniz.

İlgili konular