Bir minidump'a göre, bazı dosyalar özyinelemeli bir ayrıştırıcıda yığın taşmasına neden olan bir durumla karşılaştım. Maalesef ellerimi, sorunu çözmek için bunu yapan bir dosya örneğini alamıyorum (müşterinin gizlilik endişeleri var), ki bu, şu andaki gerçek problemin teşhisi için beni biraz sinirlendiriyor.Bir çalışan iş parçacığındaki yığın taşmasını nasıl önleyebilirim veya kurtarırım?
Çözümleyicinin biraz dikkat etmesi gerekiyor, ancak şu an için en öncelikli programın çalışmaya devam etmesini sağlamaktır. Bir stopgap önlemi olarak, tüm programı indirmekten kaçınmak için ne yapabilirim?
Benim ilk tercihi taşma olmadan önce ben incelikle ayrıştırıcı iptal böylece ben yığın odasına tükeniyor tahmin etmenin bir yolunu bulmak olacaktır. Dosya ayrıştırılamıyor kabul edilebilir bir seçenektir. İkinci seçenek, bunun olmasına izin vermek, hatayı yakalamak ve kayıt etmek, ardından verilerin geri kalanıyla devam etmek olacaktır.
ayrıştırma bir Parallel.ForEach()
döngü içinde gerçekleşiyor. Bu yardımcı olacak başka bir yaklaşım için bunu değiştirmek için istekli değilim.
DÜZENLEME: Geçerli katmanın yığınının boyutunu ve yığın işaretçisinin konumunu alabilseydim gerçekten katil ne olurdu? Mümkün mü?
DÜZENLEME 2: Sonunda bir örnek dosyasını birinden çıkarmayı başardım ve hatayı bir hata ayıklayıcısında yakaladım. Bu, bize ait olan kod değil - istisna HtmlAgilityPack'da bir yerde oluyor. Öyle görünüyor ki, tamamen farklı bir tack bulmaya çalışacağım.
Yığın taşmasına tam olarak neden olan şey net olmadığından (paralellizm bu duruma neden olmamalıdır: recursiveness olabilir) yardımcı olacağından emin değilsiniz, ancak aynı anda yapılan aramaların miktarını sınırlamak için 'ParallelOptions.MaxDegreeOfParallelism' kullanmayı denediniz mi? – Jcl
Bir seçenek sadece parse geçerli "derinlik" izlemek ve çok yüksek alırsa kefalet etmektir. – dlev
@dlev Yine de daha fazla ayrıntı istiyorum. .NET belgelerine göre, hem yığın çerçeveleri hem de çağrı yığını bir bütün olarak farklı boyutlara sahip olabileceğinden, uygun bir maksimum derinliği nasıl seçerim? –