2010-09-10 56 views
0

我正在編寫C#程序(C#,&面向對象編程新手) 我試圖在多個線程中下載頁面。只運行1個線程時沒有問題。我運行多個時出現問題。Libcurl通過線程

好像所有的線程都將下載的信息保存在同一個變量SockBuff中,但我不知道如何解決這個問題。

對此提出建議?

這裏是代碼

當我點擊按鈕時程序啓動。

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     void TestaThread_1() 
     { 
      Random RandomNumber = new Random(); 
      int rand = RandomNumber.Next(99); 

      HTTP cURL = new HTTP(); 
      cURL.CurlInit(); 
      String data = cURL.HTTPGet("http://google.com", "", "fails" + rand.ToString() + ".html"); 
      HTTP.save_file("fails" + rand.ToString()+ ".html", data); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      Thread thread1 = new Thread(new ThreadStart(TestaThread_1)); 
      thread1.Start(); 

      Thread thread2 = new Thread(new ThreadStart(TestaThread_1)); 
      thread2.Start(); 

      Thread thread3 = new Thread(new ThreadStart(TestaThread_1)); 
      thread3.Start(); 

      Thread thread4 = new Thread(new ThreadStart(TestaThread_1)); 
      thread4.Start(); 

      Thread thread5 = new Thread(new ThreadStart(TestaThread_1)); 
      thread5.Start(); 
     } 
    } 

    class HTTP 
    { 
     public Easy easy;   
     public static string SockBuff; 
     public string CookieFile = AppDomain.CurrentDomain.BaseDirectory + "cookie.txt"; 
     public string UserAgent = "Mozilla 5.0"; 
     public string Proxy = ""; 


     public void CurlInit() 
     { 
      Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL); 
     } 


     public string HTTPGet(string URL, string Proxy, String FailaNosaukums) 
     { 
      easy = new Easy(); 
      SockBuff = ""; 

      try 
      { 
       Easy.WriteFunction wf = new Easy.WriteFunction(OnWriteData); 

       easy.SetOpt(CURLoption.CURLOPT_URL, URL); 
       easy.SetOpt(CURLoption.CURLOPT_TIMEOUT, "60"); 
       easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf); 
       easy.SetOpt(CURLoption.CURLOPT_USERAGENT, UserAgent); 
       easy.SetOpt(CURLoption.CURLOPT_COOKIEFILE, CookieFile); 
       easy.SetOpt(CURLoption.CURLOPT_COOKIEJAR, CookieFile); 
       easy.SetOpt(CURLoption.CURLOPT_FOLLOWLOCATION, true); 

       if (URL.Contains("https")) 
       { 
        easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYHOST, 1); 
        easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0); 
       } 

       if (Proxy != "") 
       { 
        easy.SetOpt(CURLoption.CURLOPT_PROXY, Proxy); 
        easy.SetOpt(CURLoption.CURLOPT_PROXYTYPE, CURLproxyType.CURLPROXY_HTTP); 
       } 

       easy.Perform(); 
       easy.Cleanup(); 

      } 
      catch 
      { 
       Console.WriteLine("Get Request Error"); 
      } 

      return SockBuff; 
     } 


     public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData) 
     { 
      Random rand = new Random(); 
      int RandomNumber = rand.Next(1000); 

      SockBuff = SockBuff + System.Text.Encoding.UTF8.GetString(buf); 

      return size * nmemb; 
     } 

     static public void save_file(string file_name, string text_to_write) 
     { 
      StreamWriter MyStream = null; 
      string MyString = text_to_write; 

      try 
      { 
       MyStream = File.CreateText(file_name); 
       MyStream.Write(MyString); 
      } 
      catch (IOException e) 
      { 
       Console.WriteLine(e); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e); 
      } 
      finally 
      { 
       if (MyStream != null) 
        MyStream.Close(); 
      } 
     } 
    } 
} 

我有另外一個問題。

爲什麼我無法使用save_file函數正確保存圖像文件?在buff中有編碼問題嗎?

回答

1

問題是您的SockBuffstatic,因此HTTP類的所有實例僅共享該變量的一個實例。您可以通過刪除static來解決問題。

如果你這樣做,你還必須使你的OnWriteData方法成爲一個實例方法(即不是靜態的)。

您也可以考慮使用System.Net.WebClient和/或System.Net.HttpWebRequest類代替Libcurl。

+0

工作很好!謝謝。爲什麼System.Net比libcurl更好? – user444434 2010-09-10 15:03:37

+0

我很高興我的回答很有幫助。並不是說System.Net類比Libcurl「更好」。老實說,我對.NET上的Libcurl不太瞭解,哪個更好。但根據我的經驗,儘可能使用.NET庫是有意義的,因爲它可以簡化事物(不必包含其他庫),它們通常運行良好,並且它們將被更廣泛地使用和理解(意味着我可以更多如果我需要的話,輕鬆獲得幫助)。 – 2010-09-10 15:09:43

+0

@ user444434你能分享你如何用線程解決上述問題嗎? – confusedMind 2017-06-19 18:32:59