Добрый день уважаемый форумчане. В общем задумал переход на C#, но возникла проблемка. А именно, в многопоточности. Сама либа поставилась без проблем, с одним потоком работает тоже хорошо. Вот код самого класса.
| Код | public class EasyThread { private static Easy.WriteFunction wf;
private static string Buff; private static int thr_num;
public static string UserAgent = "Mozilla 5.0";
// static class constructor to create static delegate static EasyThread() { Console.WriteLine("EasyThread class constructor"); wf = new Easy.WriteFunction(OnWriteData); }
// instance constructor for url public EasyThread(int thr) { thr_num = thr;
if (File.Exists(thr_num + "_cookie.txt")) { File.Delete(thr_num + "_cookie.txt"); }
}
public string EasyGet(string url) { string CookieFile = thr_num + "_cookie.txt"; Easy easy = new Easy(); easy.SetOpt(CURLoption.CURLOPT_URL, url); easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf); easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, url); easy.SetOpt(CURLoption.CURLOPT_COOKIEFILE, CookieFile); easy.SetOpt(CURLoption.CURLOPT_COOKIEJAR, CookieFile); easy.SetOpt(CURLoption.CURLOPT_USERAGENT, UserAgent); easy.Perform(); easy.Cleanup(); return Buff;
}
public string EasyPost(string url, string Content, string Proxy) { Buff = ""; string CookieFile = thr_num + "_cookie.txt"; Easy easy = new Easy(); easy.SetOpt(CURLoption.CURLOPT_URL, url); easy.SetOpt(CURLoption.CURLOPT_WRITEFUNCTION, wf); easy.SetOpt(CURLoption.CURLOPT_WRITEDATA, url); easy.SetOpt(CURLoption.CURLOPT_COOKIEFILE, CookieFile); easy.SetOpt(CURLoption.CURLOPT_COOKIEJAR, CookieFile); easy.SetOpt(CURLoption.CURLOPT_USERAGENT, UserAgent); easy.SetOpt(CURLoption.CURLOPT_REFERER, ""); easy.SetOpt(CURLoption.CURLOPT_FOLLOWLOCATION, true); easy.SetOpt(CURLoption.CURLOPT_TIMEOUT, "60");
easy.SetOpt(CURLoption.CURLOPT_POST, true); easy.SetOpt(CURLoption.CURLOPT_POSTFIELDS, Content);
if (url.Contains("https")) { easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYHOST, 1); easy.SetOpt(CURLoption.CURLOPT_SSL_VERIFYPEER, 0); }
easy.Perform(); easy.Cleanup(); return Buff;
}
public static Int32 OnWriteData(Byte[] buf, Int32 size, Int32 nmemb, Object extraData) { Buff = Buff + System.Text.Encoding.UTF8.GetString(buf);
return size * nmemb; } }
|
Да, код написан хреново, но это для примера накидал. Юзал чужой, думал может там косяк.. В общем получается что у нас в переменной Buff скапливается всё со всех потоков и мы в конечном результате получаем ахинею. Как этого можно избежать? По идее изменить функцию OnWriteData и не использовать статические переменные и сделать саму функцию не статической. Что подскажите? |