2012-11-07 25 views
5

Artık bir medya oynatıcı yapıyorum .. Şarkı aramak için gerçek zamanlı arama fonksiyonu ekledim. (WMP gerçek zamanlı arama gibi bir şey).WPF Denetimi Ayrı UI İş Parçacığı On?

Arama işlemi sırasında veritabanına erişmek ve IEnumerable yüklemek bir BackGroundProcess üzerinden başka bir iş parçacığına yapılır. Kullanıcı Arabirimi, bir UIElement'in bir görevlisini çağırmak suretiyle güncellenir.

Bu işlem oldukça hızlıdır, ancak metin kutusuna arama anahtar sözcüklerini girerken küçük bir gecikme olduğu anlaşılmaktadır, bu durum Listbox.ItemSource güncelleştirmesinin biraz zaman alacaktır. yani "Adele" kelimesini aramak istediğinizde, "a" yazdığınızda, arama fonksiyonu "A" için sonuçları yükler, ancak "Adele" sözcüğünü yazarken, " d "" e "" l "" e "ve bu harfler arasında küçük bir gecikme var.

Bu arama işlemi sırasında, kullanıcı arayüzünü güncellemeyi durdurduğumda arama işlemi çok düzgün görünüyor, bu sadece Listbox'ın iş parçacığı kilitlediğini anlamış, böylece Listbox'ı çalarken oynatıcının Kullanıcı Arabiriminin geri kalanı orada sıkıştı. işlenmesiyle bitti.

Listbox Control'ü başka bir kullanıcı arabirimine koyabiliyorsam, Listbox'ı yüklemek için geçen süreye bakılmaksızın oynatıcının düzgün akışını koruyabileceğime inanıyorum. FYI: Data Virutualization var & ListBox'ta UI var Sanallaştırma çalışıyor

ListBox denetimini başka bir kullanıcı arabirimine nasıl yerleştirebilirim? WPF, C# peşin :) ASP.NET'te

+0

Etkili bir şekilde, en azından hiç görmediğim şekilde yapamazsınız. – Servy

+0

. Net 4.5 Kullanımı?bindings üzerinde güzel bir Gecikme özelliği var, burada sizin için kolay bir kazanç olabilir, temelde 100ms gibi bir değere ayarlayın ve kullanıcı yalnızca bu süre boyunca yazmayı durdurursa (veya presler veya textbox) bağlantıları günceller Odağı kaybeder) – Andy

+1

Bir ve bir tane UI iş parçacığı vardır. –

cevap

5

- bu

İstekte daraltma daha iyi olurdu (hatta normalde ya) hızlı yazarken bazı gecikmeye neden oluyor, biz bu konuda azaltmasını kullanın dağıtıcı iş parçacığı.

public static class DispatcherExtensions 
{ 
    private static Dictionary<string, DispatcherTimer> timers = 
     new Dictionary<string, DispatcherTimer>(); 
    private static readonly object syncRoot = new object(); 

    public static string DelayInvoke(this Dispatcher dispatcher, string namedInvocation, 
     Action action, TimeSpan delay, 
     DispatcherPriority priority = DispatcherPriority.Normal) 
    { 
     lock (syncRoot) 
     { 
      if (String.IsNullOrEmpty(namedInvocation)) 
      { 
       namedInvocation = Guid.NewGuid().ToString(); 
      } 
      else 
      { 
       RemoveTimer(namedInvocation); 
      } 
      var timer = new DispatcherTimer(delay, priority, (s, e) => 
       { 
        RemoveTimer(namedInvocation); 
        action(); 
       }, dispatcher); 
      timer.Start(); 
      timers.Add(namedInvocation, timer); 
      return namedInvocation; 
     } 
    } 


    public static void CancelNamedInvocation(this Dispatcher dispatcher, string namedInvocation) 
    { 
     lock (syncRoot) 
     { 
      RemoveTimer(namedInvocation); 
     } 
    } 

    private static void RemoveTimer(string namedInvocation) 
    { 
     if (!timers.ContainsKey(namedInvocation)) return; 
     timers[namedInvocation].Stop(); 
     timers.Remove(namedInvocation); 
    } 


} 

Eğer MVVM kullanmadığınız varsayarsak, kolayca böylece düğmesini

Dispatcher.CurrentDispatcher.DelayInvoke("UpdateSearch", 
     YourMethodThatStartsBackgroundThread,Timespan.FromSeconds(1)); 
Ayrıca

değerinde bir tıklayın.BREAKBREAKUnutmayın gibi kullanabiliriz: Eğer 4.5 kullanıyorsanız f bağlamaları üzerinde Delay mülkiyet yoktur bakabilirdi.

+0

Teşekkürler adam, şimdi bunu kontrol edeceğim! – Xero

+0

Yessss !! ÇALIŞIYOR bir cazibe gibi! Çok Yararlı kod parçası! – Xero

+0

@ Xero muhtemelen Microsoft'un ReactiveExtensions'ına bakmaktan büyük fayda sağlayacaktır. (Rx). Gördüğüm öğreticilerin çoğu, sorguları çok kolay bir şekilde nasıl atabileceğinizi göstermek için bir yol gösterdi. – Thelonias

1

, içinde

Teşekkür Yukleme biz arama başlamak için en fazla 3 char iki yöntemlerle en

  • bekleyin kullanın.
  • Kullanıcı yazdıktan sonra ve aramaya başlamadan önce bazı milisaniye beklerken, kullanıcı bazı milisaniye cinsinden hızlı yazdıklarından, arama teriminiz birden fazla karakter içerir. Bu ikinci seçenek, kullanıcı her basıldığında her zaman bu zamanlayıcıyı sıfıra (durdurmadan) sıfırlamaya başladığında bir zamanlayıcı başlatmayı içerir. Eğer arama kriteri 3 veya daha fazla karakter varsa Sadece arama ve kullanımı: kullanıcı (örnek) 2000 milisaniye yazmaya durduğunda sen mükemmel bir yaklaşım bu iki yöntemlerle en birleştirmektir

arama gerçekleştirmek zamanlayıcısı. Her Tuşa basıldığında veritabanı sorgulama yapıyorsanız

İlgili konular