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ı
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! –
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. –
Hata yok! Program iyi çalışıyor! Ama pencereyi hareket ettiremiyorum ya da herhangi bir tuşa tıklayın ... – peter70