2016-04-13 29 views
0

C# programımda genel olarak iyi çalışan bir dizeyi indirmek için WebClient kullanıyorum, ancak zaman zaman istisna yapıyorum "object reference bir nesnenin örneğine ayarlanamaz. WebClient DownloadString, bazen "nesne başvurusu bir nesnenin örneğine ayarlanmadı" özel durumuna neden olur.

Aşağıdaki örnek

kodun ilgili kısmını gösterir:

istisna bu kod satırında olur
String ResponseString = ""; 
String URITarget = "..... my URI information ....."; 

using (WebClient WebClientInstance = new WebClient()) 
{ 

    WebClientInstance.Encoding = System.Text.Encoding.UTF8; 
    WebClientInstance.Headers.Add("Content-Type", "application/json"); 

    ResponseString = WebClientInstance.DownloadString(URITarget); 

} 

: Yukarıdaki kod ile konuları ve dolayısıyla işlevini kullanıyorum gibi

ResponseString = WebClientInstance.DownloadString(URITarget); 

teorik olarak farklı thread'lardan aynı anda çağrılabilir, ilk önce WebClient'in thread-safe olmadığı için sorunun threadlardan kaynaklandığını düşündüm. yerine gerçek nedense NULL veya en azından boş bir dize

private Object SendWebClientHTTPRequestThreadLock = new Object(); 

... 


String ResponseString = ""; 
String URITarget = "..... my URI information ....."; 

lock (SendWebClientHTTPRequestThreadLock) 
{ 

    using (WebClient WebClientInstance = new WebClient()) 
    { 

     WebClientInstance.Encoding = System.Text.Encoding.UTF8; 
     WebClientInstance.Headers.Add("Content-Type", "application/json"); 

     ResponseString = WebClientInstance.DownloadString(URITarget); 

    } 

} 

o WebClientInstance.DownloadString olabilir (URITarget): Ama yukarıdaki kod etrafında kilidi (SendWebClientHTTPRequestThreadLock) uyguladıktan sonra, herhangi bir iyileşme getirmedi ? Baska öneri?

+1

Gönderilen kod, 'DownloadString' uygulamasında gömülü bir yer dışında bir' NullReferenceException 'atamıyor. Lütfen tüm yığın izlemeyi yayınlayın ve ilgili olduğunu düşündüğünüzün ötesinde, bize [minimum, eksiksiz ve doğrulanabilir bir örnek] (http://stackoverflow.com/help/mcve/) verin. –

+0

NULL döndüren WebClientInstance.DownloadString (URITarget) 'değil. Görünüşe göre, WebClientInstance'ın kendisi bir nedenden dolayı 'null' ve bu nedenle herhangi bir yöntemini arayamazsınız. –

+0

Sorunun analizini iyileştirmek için başvuruma biraz daha mantık ekledim. Ne yazık ki (ya da neyse ki?), Sorun geçen haftadan beri tekrar ortaya çıkmadı. Durumu takip etmeye devam ediyorum ve mümkün olan en kısa zamanda daha fazla detay ile geleceğim. – Reboon

cevap

0

WebClientInstance nesnesinin, kullanım bloğu sonlandırılmadan önce geçersiz kılınması, tuhaftır. Bir kaynak sorunu veya uygulamanızda bir bellek sızıntısı ile ilgili olabileceğini tahmin ediyorum. Belki de iş parçacığı havuzunun sınırlarını zorluyorsunuz ve iş parçacıklarınız bu nedenle aniden sonlanıyor.

WebClient'in WebClient.DownloadStringTaskAsync gibi engellenmeyen yöntemlerini de dener ve bunun bir fark yaratıp yaratmadığını görürsünüz. Bu sorunu çözmezse güvenli iş parçacığı havuzu yönetimi için iş parçacıkları yerine TPL kullanmayı deneyebilirim.

+0

Daha fazla * garip * - dil standardı ve tüm pratik derleyici uygulamaları, * imkansız *. Kurucu çağrısı atmazsa, sonuç "değil" olur. SInce değişkene herhangi bir atama yapılmaz, 'null' olamaz. Çalışma zamanı, kaynaklarla ne olup bittiğine bakılmaksızın değişkenleri aniden geçersiz kılmayacaktır. "WebClientInstance" nesnesinin yeniden başlatılmasının "son derece olası olmadığı sonucuna varabiliriz. OP'nin ilgili detayları bırakması çok daha muhtemeldir. Tahmin ederek önerdiğiniz şey, neredeyse hiç işe yaramayan av tüfeği hata ayıklamadır. –

+0

Evet, haklısınız. Ben sadece size bir yanıt olarak gönderilen yoruma atıfta bulunmaktaydım ... Sorun elbette herhangi bir şey olabilir, ancak OP bütün uygulamayı burada yayınlayamadığı için tekrarlayıcı bir yaklaşım benimsemeli ve bir yerden başlamalıyız. ellerimizi gökyüzüne fırlat ve sorumu ... –

+0

Eğer yorum yapmak için henüz bir itibarınız olmasa da (ve sadece eğer) bir yanıt olarak yorum gönderebilirsiniz, ancak metin yaptığınızda yaptığınız şeyin açık olmasını sağlar. Soruyu iyileştirmeye çalışmak gayet iyi, ama cevaplar bunun için değil. –

0

Muhtemelen güvenlik sorunuyla ilgilidir. Bazı ana bilgisayarlar, okuma akışına izin vermek için kimlik doğrulaması yapmalıdır. Hata için uzak sunucuyu kontrol edin (403) Yasak. Bu durumda, dosyaya erişmek için kullanıcı adını ve şifreyi girmeniz gerekir.

+0

Bu bir yorum olabilir .. !! –

İlgili konular