Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > С#, curl, многопоточность =)


Автор: Damp1L 7.1.2011, 19:33
Добрый день уважаемый форумчане. В общем задумал переход на 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 и не использовать статические переменные и сделать саму функцию не статической. Что подскажите?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)