Kaçak Çapraz Konu Operasyonu istisna Herhangi bir çözüm?

oy
15

Eğer veri C # bağlandığında, veri değiştirir ipliği çok değiştirmek için denetimi neden olur. Konuyu kontrolü oluşturulduğu biri değil Ama eğer bir Yasadışı Çapraz Konu Operasyonu istisna elde edersiniz.

Bunu önlemenin bir yolu var mı?

Oluştur 05/08/2008 saat 08:45
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
3

Veri değişikliği çok zaman (arka plan iş parçacığı ana amacı gerçek veri değiştirme değilse, anlamında) tüketen değilse, bir temsilci verileri değiştirir bölümü hareketli ve bu temsilciyi Invoke'ing deneyin.

fiili ağır çalışma verilerine ise, muhtemelen tekrar Invoke aracılığıyla UI iş parçacığı geri işlenmiş verileri gönderir arka plan iş parçacığı, geçmek için bu verileri daha derin bir kopyasını oluşturmak gerekecek.

Yalnızca zorunda kalacak taşımak (veri değişikliği kontrol güncellemesini neyin tetiklediği olduğu için) temsilci işlevi veri değiştirir kod. Bunun dışında, ekstra bir şey yazmak zorunda olmamalıdır.

Cevap 05/08/2008 saat 09:05
kaynak kullanıcı

oy
3

Sen böyle bir şey yapmak mümkün olmalıdır:

if (control.InvokeRequired)
{
    control.Invoke(delegateWithMyCode);
}
else
{
    delegateWithMyCode();
}

InvokeRequired Kontrolleri bir özellik doğru iş parçacığı üzerinde ise, o zaman çağırır doğru iş parçacığı üzerinde temsilcisini başlatmak olacaktır görmektir.

GÜNCELLEME: Aslında benim son işte böyle bir şey yaptı:

private void SomeEventHandler(Object someParam)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new SomeEventHandlerDelegate(SomeEventHandler), someParam);
    }

    // Regular handling code
}

hangi başka blokta ihtiyacını ortadan kaldırır ve tür kodunu sıkılaştırır.

Cevap 05/08/2008 saat 08:51
kaynak kullanıcı

oy
1

Ben bu çözüm garanti edemez gitmek için bir test vakası yok ama benzer bir senaryo farklı evrelerde ilerleme çubukları güncelleştirmek için kullanılan geliyor bana burada uygun olacaktır (bir temsilci kullanın).

public delegate void DataBindDelegate();
public DataBindDelegate BindData = new DataBindDelegate(DoDataBind);

public void DoDataBind()
{
    DataBind();
}

ihtiyaçlarını bağlama verileri belirli bir iş parçacığı tarafından yapılacak, o zaman bu iş parçacığı işini yapsın!

Cevap 05/08/2008 saat 08:56
kaynak kullanıcı

oy
0

WPF ve Silverlight yılında bağlayıcı altyapı UI iş parçacığı için anahtarlama ilgilenir.

Cevap 08/08/2008 saat 17:19
kaynak kullanıcı

oy
0

İplik çağrısı "yasadışı" ise (DataBind çağrısı ondan çağrılan dizisindeki oluşturulmamış denetimleri etkiler yani) DataBind kararı / hazırlanan yapılır olmasa bile, böylece o zaman bir temsilci oluşturmanız gerekir kontrol oluşturma ipliği, bunlardan herhangi elde edilen modifikasyon (örneğin DataBind ()) olacaktır.

Öyle gibi çalışan iş parçacığı kodumu çağırır:

this.BindData.Invoke();

Bu da orijinal iplik çalışması gerekir (bunu küstah kontrolleri oluşturulan iplik), hangi bağlama yapmak neden olur.

Cevap 05/08/2008 saat 09:06
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more