Soru & Cevap

Thread, Dispatcher ve Backgroundworker Hakkında

21.09.2020 - 03:44

Merhabalar, wpf ile bir uygulama geliştirmekteyim. Bu uygulamanın esas amacı bir excel seçerek içindeki verileri alıp veritabanına kaydetmesi. 10 üzerinde tabloya binlerce veri işlerken haliyle UI kısmı donuyor, bunun için thread, backgroundworker kullanmam gerektiğini öğrendim. Türkçe/yabancı bir çok siteyi araştırdım ancak bilgiler çok karışık tam olarak anlayamadım. Ben excelden verileri alınırken programda diğer sayfaya geçerek veriler içinde arama da yapmak istiyorum ancak bir türlü uygulayamadım.
Backgroundworker için kodum;
private void BgWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            progressbar.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate ()
            {
                progressbar.Visibility = Visibility.Visible;
            });
            Thread.Sleep(100);
            Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
            {
                ExcelController.ImportedExcel(txt_MaxLine.Text, txt_Sheet.Text);
            }));
        }

Burada progressbar xaml kısmında sonsuz döngü halindedir, bw için gerekli kodu yazarak ilk önce progressbarı görünür yapıp daha sonra da bir excel seçtirip excelden verileri veritabanına aktarmasını istedim. Ancak bu kod ile tüm program donuyor ta ki işlem bitene kadar.
Başka bir kodda ise bu iki işlemi iki ayrı metodda tanımladıktan sonra buton'un click eventinde;

private void btn_Import_Click(object sender, RoutedEventArgs e)
        {         

Thread th=new Thread(Progress);

th.Start();

Thread th1=new Thread(Imported);

th1.Start();

}

Şeklinde bir kod ile işlem yaptırdığımda ise aynı şekilde bw gibi tepkisiz kaldı.
Ben gerçekten bu olayı kavrayamadım, sırf bw kullanan veyahut sırf thread kullanan bazı videolarda işlem yaptırırken UI onlarda donmaz iken bende donuyor bırakın başka sayfaya geçip arama yapmayı, aynı sayfada bulunan UI bile çalışmıyor. Neyi yanlış yapıyorum acaba?

124 Görüntülenme

1 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user gmyucalfarukeren
gmyucalfarukeren
19.02.2023 - 05:35

Merhaba Utku Bey, demek istediğinizi anladığımı düşünüyorum ve araştırma yaptım. 

UI donmaları ve yavaşlamaları, uzun süreli işlemlerin UI thread üzerinde çalıştırılması nedeniyle oluşur. Bu nedenle, bu işlemleri yapmak için, başka bir thread kullanarak işlemleri arka planda gerçekleştirmeniz gerekir

BackgroundWorker, .NET Framework'ün eski bir öğesidir ve daha modern alternatifler mevcuttur. Örneğin, C# 5.0'dan itibaren, async/await anahtar kelimeleri kullanarak uzun süreli işlemleri gerçekleştirmek mümkündür. Bu teknik, daha basit ve okunaklı kod yazmanıza olanak tanır

Ancak, sizin kullanmanız gereken en uygun teknik, işlemleri gerçekleştirmek için Task.Run() metodunu kullanmaktır. Bu metod, uzun süreli işlemleri farklı bir thread üzerinde gerçekleştirmenizi sağlar. Ayrıca, async/await kullanarak, sonucun tamamlanmasını beklemek için gereken kodu daha basit hale getirebilirsiniz

Örneğin, aşağıdaki kod, Task.Run() metodunu kullanarak, Excel verilerini arka planda aktaran bir yöntem gösterir

 

private async void btn_Import_Click(object sender, RoutedEventArgs e)
{
    progressbar.Visibility = Visibility.Visible;
    await Task.Run(() =>
    {
        ExcelController.ImportedExcel(txt_MaxLine.Text, txt_Sheet.Text);
    });
    progressbar.Visibility = Visibility.Collapsed;
    // Burada diğer sayfaya geçiş kodunu yazabilirsiniz
}