Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> С#, curl, многопоточность =), Проблема с static и потоками 
:(
    Опции темы
Damp1L
  Дата 7.1.2011, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Добрый день уважаемый форумчане. В общем задумал переход на 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 и не использовать статические переменные и сделать саму функцию не статической. Что подскажите?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.