Forum
Merhaba,
c# ile 2 tane GridControl'üm var.
GridControl1 master table,
GridControl2 detail table,
1 tane KayitEkle methodum var. Bu method
private Task KayitEkle ()
{
return Task.Run(() =>
{
try
{
////........
}
catch (Exception)
{
}
});
}
şeklinde çalışıyor.
kayitEkle methodunda işlemler basit olarak for döngüsü ile GridControl1 (master tablosunda) ilk kayda fokuslanıyor.
Her fokuslanma sonucunda da GridControl2 (detail tablosu) 'na yeni veriler geliyor. bu tablo üzerindeki satırlar tek tek veritabanına kayıt ediliyor.
Method'u void ile yaptığımda hiç bir sorun olmaz iken, Task ile yaptığımda zaman uyumsuz bazı verilere geldiğinde
"Nesne şu anda başka bir yerde kullanılıyor" uyarısı alıyorum. Bunun sebebi Task'ın asenkron çalıştığından dolayı önceki işlem bitmeden,
yeni satıra focuslanıp GridControl2 (detay tablosuna) 'da yeni verileri görüntülemeye çalıştığı için olduğu tahmin ediyorum.
Bu aşamada nasıl bir yol izlemeliyim. Yardım ve destekleriniz için şimdiden teşekkür ederim.
Merhaba,
Asenkron olarak çalışan bir Task içinde UI elemanlarını güncellemek genellikle doğru bir yaklaşım değildir, çünkü Task farklı bir thread üzerinde çalışırken, UI elemanlarının (GridControl'ler gibi) ana thread üzerinde oluşturulması ve güncellenmesi gerekmektedir. Bu tür durumlarda, Task'ın sonucu UI thread'ine dönmek ve orada işlem yapmak için Invoke (Windows Forms) veya Dispatcher.Invoke (WPF) gibi yöntemleri kullanabilirsiniz.
Aşağıda, Task'ın sonucunu UI thread'ine döndürmek için Dispatcher.Invoke kullanarak örnek bir yöntem bulabilirsin;
private async Task KayitEkle()
{
await Task.Run(() =>
{
try
{
// GridControl1 master table işlemleri...
// Burada fokuslanma işlemi yapılır, ancak sonuçları UI thread'ine döndürmek için Dispatcher.Invoke kullanılır.
Application.Current.Dispatcher.Invoke(() =>
{
// GridControl2 detail table işlemleri...
// Yeni veriler GridControl2'ye eklenir ve veritabanına kaydedilir.
});
}
catch (Exception ex)
{
// Hata yönetimi işlemleri...
}
});
}
Bu şekilde, GridControl2'ye yeni verileri eklemeye çalışırken "Nesne şu anda başka bir yerde kullanılıyor" hatasını almamalısınız, çünkü GridControl2'ye erişim, UI thread'inde gerçekleştirilecektir.
Dikkat etmeniz gereken diğer bir nokta, Task'ın içindeki işlemleri birden fazla thread'de çalıştırmak zorunda kalmamak için, sadece UI thread'inde yapmanız gereken işlemleri Task'ın dışında tutmaktır. Task sadece uzun süren işlemleri (örn. veritabanı kayıtlarınızı yapma) içermelidir ve UI elemanlarına erişim, Invoke veya Dispatcher.Invoke içinde yapılmalıdır.
Danışman - ITSTACK Bilgi Sistemleri
****************************************************************
Probleminiz Çözüldüğünde Sonucu Burada Paylaşırsanız.
Sizde Aynı Problemi Yaşayanlar İçin Yardım Etmiş Olursunuz.
Eğer sorununuz çözüldü ise lütfen "çözüldü" olarak işaretlerseniz diğer üyeler için çok büyük kolaylık sağlayacaktır.
*****************************************************************
Hocam vermiş olduğunuz kod ile denedim lakin yine aynı hatayı alıyorum. Belki kodlamam ile alakalı başka bir sorun vardır.
Sorunu dediğiniz şekilde UI tarafında görüntülemeden arka planda yaparak çözüme ulaştım.
Yardım ve destekleriniz için çok teşekkür ederim.
Rica ederim.
Danışman - ITSTACK Bilgi Sistemleri
****************************************************************
Probleminiz Çözüldüğünde Sonucu Burada Paylaşırsanız.
Sizde Aynı Problemi Yaşayanlar İçin Yardım Etmiş Olursunuz.
Eğer sorununuz çözüldü ise lütfen "çözüldü" olarak işaretlerseniz diğer üyeler için çok büyük kolaylık sağlayacaktır.
*****************************************************************