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中有編碼問題嗎?
工作很好!謝謝。爲什麼System.Net比libcurl更好? – user444434 2010-09-10 15:03:37
我很高興我的回答很有幫助。並不是說System.Net類比Libcurl「更好」。老實說,我對.NET上的Libcurl不太瞭解,哪個更好。但根據我的經驗,儘可能使用.NET庫是有意義的,因爲它可以簡化事物(不必包含其他庫),它們通常運行良好,並且它們將被更廣泛地使用和理解(意味着我可以更多如果我需要的話,輕鬆獲得幫助)。 – 2010-09-10 15:09:43
@ user444434你能分享你如何用線程解決上述問題嗎? – confusedMind 2017-06-19 18:32:59