0

içinde çalışan bir sınıf içinde bir WebBrowser çalıştıran bazı metin verileri kazıyarak WebBrowser denetimi kullanan bir sınıf oluşturdum, başlangıçta bir Windows Forms uygulamasında çalıştıran, şimdi dönüştürdüm Bir konsol uygulaması, sınıfım bir iş parçacığı içinde çalıştırın ve STA olarak ayarlayın, sonra benim sınıfın içinde "yeni" anahtar sözcüğünü kullanarak WebBrowser'ı normal şekilde örneklendiririm, sorun iş parçacığı tamamlandığında gerçekten bitmeyecek Thread.Join() kullandığımda sonsuz beklemeye girerim ve Application.ThreadExit() işlevini kullanırsam hiçbir şey olmuyor, bu yüzden Thread.Abort() yöntemini denedim ve bu rastgele istisnalar atmaya devam ediyor, sorum şu doğru yol nedir? WebBrowser'ı bir Konsol uygulamasında başlatması gereken bir sınıfı çalıştırmak için. Ben aşağıdakileri yapınKonsol uygulaması: STA iş parçacığı

var th = new Thread(() => 
{ 
    var br = MyBrowsingClass; 
    br.NavigateTo(url); 
    System.Windows.Forms.Application.Run(); 
}); 
th.SetApartmentState(ApartmentState.STA); 
th.Start(); 
return th; 

ve benim sınıf içinde: İstediğin düşünüyorum çünkü

wb = new WebBrowser(); 
wb.ScriptErrorsSuppressed = true; 
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(OnWebComplete); 
CurrentState = Status.Navigating; 
if (IsValidURL(GoogleQueryURL)) 
{ 
    wb.NavigateTo(GoogleQueryURL); 
} 
+0

den Application.Run() ', yalnızca bir örnek olabilmesidir 'sorun. Bu yüzden paralel içerik geri dönüşü kolayca yapılamaz. Application.Exit() işlevini çağırarak "Application.Run()" işlevini sonlandırabilir ya da 'kukla' bir form oluşturabilir ve 'Application.Run (form1)' dizinine geçirebilir ve form1.Close() işlevini kapatabilirsiniz. ama aşağıda sağladığım gibi, "WebRequest" sınıfına bir göz atmalısınız. –

cevap

0

Sen, bir WebRequest sınıfını kullanmalıdır

Bu

benim sınıf için iş parçacığı oluşturmak nasıl Etkileşimli tarayıcı yerine içerik. Bu, ek bir iş parçacığıyla bir ileti pompasının ( Application.Run()) kullanımını ortadan kaldıracaktır.

using System; 
using System.IO; 
using System.Net; 
using System.Text; 

namespace Examples.System.Net 
{ 
    public class WebRequestGetExample 
    { 
     public static void Main() 
     { 
      // Create a request for the URL.   
      WebRequest request = WebRequest.Create ("http://www.contoso.com/default.html"); 
      // If required by the server, set the credentials. 
      request.Credentials = CredentialCache.DefaultCredentials; 
      // Get the response. 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      // Display the status. 
      Console.WriteLine (response.StatusDescription); 
      // Get the stream containing content returned by the server. 
      Stream dataStream = response.GetResponseStream(); 
      // Open the stream using a StreamReader for easy access. 
      StreamReader reader = new StreamReader (dataStream); 
      // Read the content. 
      string responseFromServer = reader.ReadToEnd(); 
      // Display the content. 
      Console.WriteLine (responseFromServer); 
      // Cleanup the streams and the response. 
      reader.Close(); 
      dataStream.Close(); 
      response.Close(); 
     } 
    } 
} 

KAYNAK msdn

https://msdn.microsoft.com/en-us/library/system.net.webrequest%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

+1

webclient ile ilgili sorun, ham html komut dosyaları ile dolu olmasıdır. web tarayıcısı her şeyi çözer ve çok daha iyi bir html sonucu verir ... bu yüzden webbrowser control.i için bir kukla formunu kullanmayı denemeliyim .... her biri teşekkürler ve çözdüğümde ipliği güncelleyeceğim sorun –

İlgili konular