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


Автор: Pankon 11.7.2006, 12:28
Как(где) создать поток,  который работает после окончания приложения, и его не сьест "сборщик мусора"?

 

Автор: DeadSoul 11.7.2006, 12:33
Цитата(Pankon @  11.7.2006,  12:28 Найти цитируемый пост)
Как(где) создать поток,  который работает после окончания приложения, и его не сьест "сборщик мусора"?

1. Зачем?
2. Это невозможно 

Автор: ivashkanet 11.7.2006, 12:36
Цитата(DeadSoul @  11.7.2006,  12:33 Найти цитируемый пост)
2. Это невозможно 

Поясню: приложение считается работающим, пока работает хотя бы один запущенный им поток smile 
Цитата(DeadSoul @  11.7.2006,  12:33 Найти цитируемый пост)
1. Зачем?

То же хотел бы знать?
Это вопрос из серии: "Хочу чтобы мое приложение работало после окончания работы"

Добавлено @ 12:37 
Или вопрос такой: "... потк работающий после закрытия гавной формы приложения"? 

Автор: Pankon 11.7.2006, 13:31
Цитата(DeadSoul @  11.7.2006,  12:33 Найти цитируемый пост)
Зачем?
Цитата(ivashkanet @  11.7.2006,  12:36 Найти цитируемый пост)
То же хотел бы знать?

Задача родилась из АСП проекта, в котором, пользователи должены с веб страницы запускать "серверное" приложение(разные экземпляры) и "закрывать" сессию. А запущенные приложения продолжают работу и остановливаются, когда "сделают" всю свою работу. (Серверный application тоже может быть остановлен...)







ПС. Может надо виндовс службы организовывать, но я здесь абсолютно не селен smile. И вообще можно ли "запускать" разные экземпляры одной службы из программы передав им разные входные параметры? (Надо другой топик начать...)
 

Автор: DeadSoul 11.7.2006, 13:33
Цитата(Pankon @  11.7.2006,  13:31 Найти цитируемый пост)
 И вообще можно ли "запускать" разные экземпляры одной службы из программы передав им разные входные параметры? (Надо другой топик начать...)

Нет.

 

Автор: Pankon 11.7.2006, 13:36
Цитата(DeadSoul @  11.7.2006,  13:33 Найти цитируемый пост)
Нет.

Что делать то  smile    smile  smile  smile  smile 
 

Автор: ivashkanet 11.7.2006, 13:43
Цитата(Pankon @  11.7.2006,  13:31 Найти цитируемый пост)
Задача родилась из АСП проекта, в котором, пользователи должены с веб страницы запускать "серверное" приложение(разные экземпляры) и "закрывать" сессию. А запущенные приложения продолжают работу и остановливаются, когда "сделают" всю свою работу. (Серверный application тоже может быть остановлен...)

Вообще, это лучше делать силами ASP .Net (ИМХО, ничем от win приложений не отличается, только сразу заточена под многопоточность).

А если хочешь под WinForm, то делай одно постоянно работающее приложение, которое будет раздавать потоки всем юзерам (хотя это все уже реализовано в ASP).
Цитата(Pankon @  11.7.2006,  13:31 Найти цитируемый пост)
Серверный application тоже может быть остановлен...

на то он и серверный, что всегда включен. Остановишь его и все, никто к нему доступа не получит smile 
Правда можно сделать отключение при простое, но все равно приложение много не съест ресурсов (в рамках сервера, а не домашнего компа). Так что об этом не стоит заботиться 

Автор: Pankon 11.7.2006, 14:08
Цитата(ivashkanet @  11.7.2006,  13:43 Найти цитируемый пост)
Вообще, это лучше делать силами ASP .Net
Цитата(ivashkanet @  11.7.2006,  13:43 Найти цитируемый пост)
хотя это все уже реализовано в ASP
 Так все-таки - как (примерный сценарий please)?

 

Автор: ivashkanet 11.7.2006, 14:15
Не понял?
ЛЮБАЯ ASP .Net страница ---- приложение работающее на стороне сервера.
Которое запускается отдельно для каждого пользователя.
В ней можно  делать что хочешь (хоть удалить все файлы на компе, хоть выключить его  smile )
Срочно читать инфу про ASP .Net 
http://forum.vingrad.ru/index.php?showtopic=34584
Или в Гугл
Удачи  smile  

Автор: Pankon 11.7.2006, 14:38
ivashkanet, 
Цитата(ivashkanet @  11.7.2006,  14:15 Найти цитируемый пост)
Которое запускается отдельно для каждого пользователя.
В ней можно  делать что хочешь
 это - то понятно, а вот как
Цитата(Pankon @  11.7.2006,  13:31 Найти цитируемый пост)
в котором, пользователи должены с веб страницы запускать "серверное" приложение(разные экземпляры) и "закрывать" сессию. А запущенные приложения продолжают работу и остановливаются, когда "сделают" всю свою работу
 и это тогда, когда пользователь уже давно выключил комп ... и.... спит(уже пару часов).

 

Автор: ivashkanet 11.7.2006, 14:42
Цитата(Pankon @  11.7.2006,  14:38 Найти цитируемый пост)
запущенные приложения продолжают работу и остановливаются, когда "сделают" всю свою работу

Ясно, не будут же они стопаться не доделав работу smile 
Так, вопрос
Где должны крутиться приложения? На сервере?
Наверное да, ведь 
Цитата(Pankon @  11.7.2006,  14:38 Найти цитируемый пост)
 пользователь уже давно выключил комп ... и.... спит(уже пару часов).


Добавлено @ 14:47 
Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
не будут же они стопаться не доделав работу

А еще можно, ИМХО, передать работу работающему (всегда, если нет, то запускаем его) приложению. Которое создаст поток.
P.S. А еще лучше, подождать людей, которые с этим сталкивались. А то я сейчас насоветую... smile 
Хотя, на мой взгляд, все нормуль smile  

Автор: Pankon 11.7.2006, 15:03
Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
не будут же они стопаться не доделав работу
 да они долго будут на сервере крутиться и пользователь не дождется подтверждения..., а потом БУХ и timeout их прикончит и сессию закроет, вот тут то юзер и получит "подтверждение"...  smile 
Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
На сервере?
 Угу...
Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
передать работу работающему (всегда, если нет, то запускаем его) приложению
... smile Вопрос примерно про это и был ... Так Как(где) создать -то ?

Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
А еще лучше, подождать людей, которые с этим сталкивались.
 Люди..... . .  .    .      .

 

Автор: ivashkanet 11.7.2006, 15:08
Цитата(Pankon @  11.7.2006,  15:03 Найти цитируемый пост)
Так Как(где) создать -то ?

Я знаю только так  smile 
Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
А еще можно, ИМХО, передать работу работающему (всегда, если нет, то запускаем его) приложению. Которое создаст поток.


Добавлено @ 15:10 
Цитата(Pankon @  11.7.2006,  15:03 Найти цитируемый пост)
 да они долго будут на сервере крутиться

Что ты там такое делать то собрался?
На несколько часов???
Не могу себе представить 

Автор: mr.DUDA 11.7.2006, 15:54
Обычно делается спец. табличка в базе данных, куда складывается последнее состояние юзверя (viewstate или что там может быть в асп.нет), а на сервере работает windows service, который с заданной периодичностью удаляет самые старые записи из этой таблички. Windows service элементарно пишется, в студии шаблон есть. 

Автор: Pankon 11.7.2006, 16:19
Цитата(mr.DUDA @  11.7.2006,  15:54 Найти цитируемый пост)
удаляет самые старые записи из этой таблички
 мне нужно именно работающий поток(или экземляр работающего приложения(робота)) на сервере, который делает свою работу и умирает, когда все сделает. Каждый экземпляр такого "серверного робота" получает входные параметры из асп страницы (точнее с пользовательской страницы), но это не вопрос...
Вопрос где и как хранить(запускать) такой робот. В сессии - не пойдет.. юзер закрывает броузер и идет спать, а робот должен работать...
В СерверАппликатион, говорят тоже может быть остановлен, не зависимо от присутствия серверных переменных(читай запущенных потоков)...
Создавать виндовссервисе(несколько - один для каждого юзера) и передовать ему параметры говорят - не возможно 
Цитата(DeadSoul @  11.7.2006,  13:33 Найти цитируемый пост)
Нет.


Поэтому
Как(где) создать поток, который работает, после окончания приложения(сессии)?

 smile 
 smile 
 smile 
  

Автор: mr.DUDA 11.7.2006, 16:55
Цитата(Pankon @  11.7.2006,  16:19 Найти цитируемый пост)
Создавать виндовссервисе(несколько - один для каждого юзера) и передовать ему параметры говорят - не возможно 

А я говорю - возможно. Создай сервис и общайся с ним из ASP.NET-приложения через ремоутинг. Список сессий (объектов) храни в статическом Dictionary в windows service.

Добавлено @ 16:56 
Неужели пример нужен ?  

Автор: ivashkanet 11.7.2006, 16:57
Цитата(Pankon @  11.7.2006,  16:19 Найти цитируемый пост)
Как(где) создать поток, который работает, после окончания приложения(сессии)?

Я ж тебе говорил уже: 
Цитата(ivashkanet @  11.7.2006,  14:42 Найти цитируемый пост)
А еще можно, ИМХО, передать работу работающему (всегда, если нет, то запускаем его) приложению. Которое создаст поток

Этим приложением можно сделать Win-сервис
Передавать данные приложению можно так:
Цитата(mr.DUDA @  11.7.2006,  15:54 Найти цитируемый пост)
 табличка в базе данных, куда складывается последнее состояние юзверя

 

Автор: Pankon 11.7.2006, 17:20
Цитата(mr.DUDA @  11.7.2006,  16:55 Найти цитируемый пост)
через ремоутинг. Список сессий (объектов) храни в статическом Dictionary в windows service.
Цитата(mr.DUDA @  11.7.2006,  16:55 Найти цитируемый пост)
Неужели пример нужен ?  
 А вот и Да.

Цитата(ivashkanet @  11.7.2006,  16:57 Найти цитируемый пост)
после окончания приложения(сессии)?

Цитата(ivashkanet @  11.7.2006,  16:57 Найти цитируемый пост)
работающему (всегда, если нет, то запускаем его) приложению. Которое создаст поток
 Что ты подразумеваешь под "приложение"(работающеее)? я блин в конец запутался...

Цитата(ivashkanet @  11.7.2006,  16:57 Найти цитируемый пост)
Этим приложением можно сделать Win-сервис
 А несколько..?  smile 
 

Автор: ivashkanet 11.7.2006, 17:26
Цитата(Pankon @  11.7.2006,  17:20 Найти цитируемый пост)
 А несколько..?   

Зачем тебе несколько? Одного хватит. 
Какая разница сколько их, если они могут создать сколько угодно потоков smile 
Цитата(Pankon @  11.7.2006,  17:20 Найти цитируемый пост)
"приложение"(работающеее)

Запущенное, работающее в режиме ожидания. 
Получило задание --- запустило поток --- ждет.
Получило ответ от потока --- обработало ---- опять ждет. 

Автор: Pankon 11.7.2006, 17:30
Цитата(ivashkanet @  11.7.2006,  17:26 Найти цитируемый пост)
Запущенное, работающее 
 Я так и не понял: АСП-приложение, вин-приложение, вин-сервисе (свой вариант)
 

Автор: ivashkanet 11.7.2006, 17:36
Как вижу ситуацию я:
АСП-приложение --- пишет в базу (не могу придумать нормальный способ взаимодействия двух разных приложений smile ). Написало --- забыло.
Win-сервис (зачем доп память на визуализацию жрать). Временами сканирует базу на наличие новой заявки.
Есть заявка --- запускаем поток на ее обработку --- ждем новые заявки.
Получили ответ от потока --- обрабатываем ---- опять ждет. 
Вот так. Что непонятно? 

Автор: mr.DUDA 11.7.2006, 17:57
Сел за пример, и тут простая мысль пришла в голову: а что мешает в рамках ASP.NET-овского приложения стартануть поток, ответственный за задачи "вне страницы" ? Пусть он живёт столько, сколько нужно, и управляет пользовательскими сессиями.

З.Ы. ASP.NET - это кстати сам по себе windows service, под которым стартуют потоки (из пула), выводящие каждую страницу. 

Автор: ivashkanet 11.7.2006, 20:45
Цитата(mr.DUDA @  11.7.2006,  17:57 Найти цитируемый пост)
Сел за пример, и тут простая мысль пришла в голову: а что мешает в рамках ASP.NET-овского приложения стартануть поток, ответственный за задачи "вне страницы" ? Пусть он живёт столько, сколько нужно, и управляет пользовательскими сессиями.

У меня тоже были такие мысли, а потом подумал (с подачи Pankon). А не закроется поток, при закрытии сессии
 

Автор: mr.DUDA 11.7.2006, 23:37
Цитата(ivashkanet @  11.7.2006,  20:45 Найти цитируемый пост)
 А не закроется поток, при закрытии сессии

Одно другого никак не касается. Есть процесс (aspnet_wp.exe или w3wp.exe), запущенный в нём поток ведёт себя точно так же как в любом другом приложении - 100% проверено. 

Автор: Pankon 11.7.2006, 23:55
Цитата(mr.DUDA @  11.7.2006,  17:57 Найти цитируемый пост)
в рамках ASP.NET-овского приложения стартануть
 а как же 
Цитата(Pankon @  11.7.2006,  13:31 Найти цитируемый пост)
(Серверный application тоже может быть остановлен...)
 

Автор: mr.DUDA 12.7.2006, 08:38
Цитата(Pankon @  11.7.2006,  23:55 Найти цитируемый пост)
(Серверный application тоже может быть остановлен...)

Ну остановишь ты IIS, ну и что ? Хочешь, чтобы всё продолжало работать, а смысл ? 

Автор: Pankon 12.7.2006, 10:32
Хорошо.

Тогда.... Ближе к телу, как сказал Мапасан.

Есть класс(Klass) с конструктором, который принимает один(..) входной параметер. У класса есть метод, который, в принципе, и делает всю работу, есть свойство, показывающее сосояние класса(обьекта).

Как организовать потоки 
Цитата(mr.DUDA @  11.7.2006,  17:57 Найти цитируемый пост)
в рамках ASP.NET-овского приложения
 которые запускаются по "вызову" пользователей(с веб-стр) и принимают(см. конструктор) параметер(ы) от пользователя. При этом, поток при окончании работы "освобождает от себя (во сказалsmile )"  ASP.NET-овское приложение. 
И (для админ веб-страницы)была бы возможность во время работы потоков опрашивать их "численность", а так же в каждом потоке иметь возможность "прочитать" то свойства, которое показывает сосояние класса(обьекта).

Вот примерно такая задача. Может, конечно, я что-то не правильно описал, но принцип, я думаю, понятен.

На вопрос: Неужели примеры нужены ?  Отвечаю: А вот и ДА.



 

Автор: mr.DUDA 12.7.2006, 12:11
Pankon, лови пример.

Создаём веб-сайт с двумя страницами: UserPage.aspx, AdminPage.aspx. На юзерпейдж кидаем текстбокс для имени пользователя (всё по-простому) и Label для вывода информации о состоянии (например, будем туда тайм-аут выводить), на админпейдж - таблицу Table, куда выведем список пользователей и тайм-ауты.

Добавляем классы WorkItem.cs и WorkItemManager.cs: первый будет представлять тот самый объект, о котором ты говоришь, с состоянием пользователя и его тайм-аутом. В нём же будет крутиться поток данного пользователя. Второй класс будет хранить коллекцию всех активных WorkItem-ов в виде Dictionary<имя_пользователя,WorkItem>. Список существует в единственном экземпляре, поэтому WorkItemManager сделаем синглетоном.

При каждом заходе на страницу UserPage будем проверять, есть ли у WorkItemManager-а WorkItem для данного пользователя (по введённому логину) и будем отодвигать тайм-аут на 30 секунд вперёд. При заходе на страницу AdminPage берём список пользователей и выводим инфу, полученную из WorkItem-а каждого пользователя.

UserPage.aspx.cs
Код
using System;

public partial class UserPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (this.TextBoxUserName.Text == string.Empty)
            this.LabelMyState.Text = "(введите имя пользователя и нажмите OK)";
        else
        {
            // определяем имя пользователя
            string userName = this.TextBoxUserName.Text;

            // получаем WorkItem по имени пользователя
            WorkItem workItem = WorkItemManager.Instance.GetWorkItemForUser(userName);
            if (workItem == null)
            {
                // если такого нет - создаём новый
                workItem = new WorkItem("Начал работу");
                WorkItemManager.Instance.AddWorkItem(userName, workItem);
            }

            // отодвигаем тайм-аут на 30 секунд вперёд
            workItem.SessionTimeoutSeconds = 30;

            // выводим инфу из WorkItem-а
            this.LabelMyState.Text = workItem.ItemMessage;
        }
    }
}


AdminPage.aspx.cs
Код
using System;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class AdminPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // шапка таблицы
        TableRow row = new TableRow();
        TableCell cell1, cell2;
        cell1 = new TableCell();
        cell1.Text = "Имя пользователя:";
        cell2 = new TableCell();
        cell2.Text = "Секунд до таймаута осталось:";
        row.Cells.AddRange(new TableCell[] { cell1, cell2 });
        this.Table1.Rows.Add(row);

        // выводим список пользователей и таймаутов
        foreach (string userName in WorkItemManager.Instance.GetUserNames())
        {
            // получаем WorkItem по имени пользователя
            WorkItem workItem = WorkItemManager.Instance.GetWorkItemForUser(userName);
            if (workItem == null) continue;

            // добавляем строку в таблицу
            row = new TableRow();
            cell1 = new TableCell();
            cell1.Text = userName;
            cell2 = new TableCell();
            cell2.Text = workItem.SessionTimeoutSeconds.ToString();
            row.Cells.AddRange(new TableCell[] { cell1, cell2 });
            this.Table1.Rows.Add(row);
        }
    }
}


WorkItem.cs
Код
using System;
using System.Threading;

public class WorkItem
{
    /// <summary>
    /// Конструктор.
    /// </summary>
    public WorkItem(string initialMessage
        /* тут можно добавлять любые параметры */)
    {
        this.ItemMessage = initialMessage;

        // ставим начальный тайм-аут, чтобы поток сразу же не завершил работу
        this.SessionTimeoutSeconds = 30;

        // стартуем поток
        new Thread(this.WorkingThread).Start();
    }

    string _itemMessage;
    /// <summary>
    /// Какое-то свойство объекта.
    /// </summary>
    public string ItemMessage
    {
        get
        {
            return _itemMessage;
        }
        set
        {
            _itemMessage = value;
        }
    }

    int _sessionTimeoutSeconds;
    /// <summary>
    /// Сколько секунд осталось до тайм-аута.
    /// </summary>
    public int SessionTimeoutSeconds
    {
        get
        {
            return _sessionTimeoutSeconds;
        }
        set
        {
            _sessionTimeoutSeconds = value;
        }
    }


    ////////////////////////////////////////////////////////////
    //  тут можно добавлять другие свойства
    ////////////////////////////////////////////////////////////


    /// <summary>
    /// Событие "Работа окончена".
    /// </summary>
    public event EventHandler Finished;


    /// <summary>
    /// Рабочий поток WorkItem-а.
    /// </summary>
    void WorkingThread()
    {
        // "выполняем работу" до тайм-аута.
        while(this.SessionTimeoutSeconds > 0)
        {
            Thread.Sleep(1000);

            this.ItemMessage = "Осталось " + this.SessionTimeoutSeconds.ToString() + " секунд до тайм-аута";
            this.SessionTimeoutSeconds--;
        }

        // всё, типа сессия закрыта
        // сигнализируем о завершении работы WorkItem-а
        if (this.Finished != null)
            this.Finished(this, EventArgs.Empty);
    }
}


WorkItemManager.cs
Код
using System;
using System.Collections.Generic;

public class WorkItemManager
{
    // коллекция WorkItem-ов в виде словаря "имя пользователя - WorkItem"
    Dictionary<string, WorkItem> _workItems = new Dictionary<string, WorkItem>();

    /// <summary>
    /// Возвращает объект WorkItem для указанного пользователя.
    /// </summary>
    public WorkItem GetWorkItemForUser(string userName)
    {
        lock (_workItems)
        {
            if (_workItems.ContainsKey(userName))
                return _workItems[userName];
        }
        return null;
    }

    /// <summary>
    /// Добавляет объект WorkItem для указанного пользователя.
    /// </summary>
    public void AddWorkItem(string userName, WorkItem workItem)
    {
        lock (_workItems)
        {
            _workItems[userName] = workItem;
        }
        workItem.Finished += new EventHandler(workItem_Finished);
    }

    /// <summary>
    /// Возвращает список пользователей.
    /// </summary>
    /// <returns></returns>
    public Dictionary<string, WorkItem>.KeyCollection GetUserNames()
    {
        lock (_workItems)
        {
            return _workItems.Keys;
        }
    }
    

    /// <summary>
    /// Обработчик события Finished (WorkItem завершил работу).
    /// </summary>
    void workItem_Finished(object sender, EventArgs e)
    {
        // отписываемся от события Finished
        WorkItem workItem = (WorkItem)sender;
        workItem.Finished -= new EventHandler(workItem_Finished);

        lock (_workItems)
        {
            // находим имя пользователя и удаляем WorkItem из _workItems
            foreach (KeyValuePair<string, WorkItem> p in _workItems)
            {
                if (p.Value == workItem)
                {
                    _workItems.Remove(p.Key);
                    break;
                }
            }
        }
    }



    ///////////////////////////////////////////
    // делаем наш WorkItemManager синглетоном
    ///////////////////////////////////////////

    static WorkItemManager _instance;
    public static WorkItemManager Instance
    {
        get
        {
            if (_instance == null)
                _instance = new WorkItemManager();
            return _instance;
        }
    }

    internal WorkItemManager()
    {
    }
}


Полностью проект - в аттаче:
  

Автор: Pankon 12.7.2006, 14:19
Цитата(mr.DUDA @  12.7.2006,  12:11 Найти цитируемый пост)
Pankon, лови пример.

mr.DUDA,  лови звезду...


И "последние" вопросы. 
Синглетон таботает на уровне приложения smile  
Я останавливал сессию - он работает, я очищал аппликатион ..- он работает. Я останавливал - приложение - он не работает  smile 

Как таковой на синглетон не имеется обьектой ссылки...
Тут пробел в моих знаниях: Как сборщик мусора "общается" с синглетонами (Блин никигда не задумывался.) smile 

И где почитать?

Добавлено @ 14:32 
И еще вопрос в догонку.

Мой метод, который ваполняет "всю" работу не "спит", а довольно сильно ресурсы тянет. Нужно для него "приоритет" ставить или еще что.(Если каждый такой поток (40 штук  smile ) начнет ресурсы тянуть, то в выигрыше будет первый, ведь он первый на себя одеяло натянул(Ну это собственно был вопрос)) 
и еще
если в WorkItem.cs написать static метод, не будет проблем, если к нему будут обращаться разные потоки? 

Автор: mr.DUDA 12.7.2006, 15:11
Цитата(Pankon @  12.7.2006,  14:19 Найти цитируемый пост)
Синглетон таботает на уровне приложения   
Я останавливал сессию - он работает, я очищал аппликатион ..- он работает. Я останавливал - приложение - он не работает   

Как таковой на синглетон не имеется обьектой ссылки...
Тут пробел в моих знаниях: Как сборщик мусора "общается" с синглетонами (Блин никигда не задумывался.) 

Синглетон - это понятие из паттернов проектирования. Framework ничего не знает о паттернах. Поэтому смешивать в одну кашу синглетон и сборщик мусора - некрасиво smile. По сути вопроса, слово "синглетон" означает, что где-то в статической переменной класса хранится ссылка на объект. Раз в статической - значит, эта ссылка живёт, пока выполняется приложение; ASP.NET-приложение выполняется до тех пор, пока не остановлен IIS.

Собственно, сам синглетон WorkItemManager-а существует только для того, чтобы где-то можно было хранить список объектов WorkItem; потоки в моём примере выполняются в рамках объектов WorkItem. То есть, если к примеру даже убрать из проекта класс WorkItemManager, то ничего не мешает создавать "по одному" экземпляры WorkItem-ов и хранить ссылки на них где-нибудь в другой статической переменной класса.

Цитата(Pankon @  12.7.2006,  14:19 Найти цитируемый пост)
Мой метод, который ваполняет "всю" работу не "спит", а довольно сильно ресурсы тянет. Нужно для него "приоритет" ставить или еще что.(Если каждый такой поток (40 штук   ) начнет ресурсы тянуть, то в выигрыше будет первый, ведь он первый на себя одеяло натянул(Ну это собственно был вопрос)) 

Ресурсы равномерно распределяются между потоками. То есть если сделать 100 потоков - система будет тормозить равномерно между 100 потоками. По идее, нужно как-то ограничивать колическво потоков до 10-20, например используя класс ThreadPool. 

Автор: Pankon 13.7.2006, 09:59
Цитата(Pankon @  12.7.2006,  14:19 Найти цитируемый пост)
если в WorkItem.cs написать static метод, не будет проблем, если к нему будут обращаться разные потоки? 
 smile 
 

Автор: mr.DUDA 13.7.2006, 11:42
Цитата(Pankon @  13.7.2006,  09:59 Найти цитируемый пост)
если в WorkItem.cs написать static метод, не будет проблем, если к нему будут обращаться разные потоки? 

Ну, метод должен быть не static, т.к. сами WorkItem-ы создаются в множестве экземпляров (получить конкретный можно с пом. WorkItemManager.Instance.GetWorkItemForUser(userName)). А чтобы не было многопоточных неприятностей, достаточно в теле метода поставить оператор lock на любой объект. 

Автор: Pankon 19.7.2006, 14:19
Продолжаем разговор:

Расширяем задачу, описанную http://forum.vingrad.ru/index.php?showtopic=103650&st=15# следующим образом:
Есть несколько веб-серверов, один из них "центральный". Как, по команде(ам) "центрального" запустить на "дочерних" по одному(2,3,4..)  потоку(см. http://forum.vingrad.ru/index.php?showtopic=103650&st=15#), при этом иметь возможность, как и раньше, "опрашивать" численность всех "работающих" на серверах потоках и их состояние (админ старница). 

(Средствами .НЕТ) 


ПС. Новый топик, я думаю, нет смысла заводить... 

Автор: mr.DUDA 19.7.2006, 21:16
Pankon, чем проще программа, тем лучше она работает ©

Упрощай решение задачи, или лучше продумай условие - возможно, всё проще чем ты думаешь, и не нужны все эти центральные и пр. потоки на сервере... 

Автор: Pankon 19.7.2006, 23:02
Цитата(mr.DUDA @  19.7.2006,  21:16 Найти цитируемый пост)
Упрощай решение задачи...
 Неполучается... Есть четыре (минимум) сервера, рапределенной работой на которых нужно управлять через WEB-интерфейс... (Всмысле, пользователь то об этом и не догадывается, а только получает информацию, что "процесс идет"... а позже проверяет результат работы(из БД)). 
Администратор должен иметь "расширенные" возможности, т.е. иметь возможность "наблюдать и управлять" процессами(на 4х серверах),  которые запустили пользователи...

Реализация для одного сервера практически готова.... Все работает... А вот, как "растянуть" это на на четыре IIS сервера пока что не знаю.
 

Автор: mr.DUDA 20.7.2006, 10:40
Pankon, тогда пускай они (серверы) общаются между собой как обычный клиент-сервер. Самый простой и удобный способ - выставить наружу веб-сервис, управляющий потоками сервера и выдающий информацию о тек. состоянии сервера. 

Автор: Pankon 20.7.2006, 11:37
Спасибо.

Сегодня утром, поразмышляв немного, пришел тоже к выводу, что нужно организовывать Web service на каждом сервере....

Уже пишу Manager для центрального севера  smile  

Автор: Pankon 8.9.2006, 16:58
Цитата(mr.DUDA @  11.7.2006,  23:37 Найти цитируемый пост)
Цитата(ivashkanet @  11.7.2006,  20:45 Найти цитируемый пост)
 А не закроется поток, при закрытии сессии

Одно другого никак не касается. Есть процесс (aspnet_wp.exe или w3wp.exe), запущенный в нём поток ведёт себя точно так же как в любом другом приложении - 100% проверено.  



Грабли....
Сервер 2003 прибивает поток через 20 минут работы.... smile
Сервер 2000 работает как часы - часами smile

Однако, что же такое с сервером 2003  smile 

 smile 



ПС. Пробовал менять timeout - результат - тот же

Автор: mr.DUDA 8.9.2006, 21:39
Цитата(Pankon @  8.9.2006,  16:58 Найти цитируемый пост)
Грабли....Сервер 2003 прибивает поток через 20 минут работы.... Сервер 2000 работает как часы - часами Однако, что же такое с сервером 2003

видимо, есть настройки типа Thread Pool в самом IIS под 2003-ю винду... там кстати и worker process по другому называется smile, w3wp.exe или что-то в этом роде...

Автор: Yama 14.12.2006, 12:34
1. при работе он-лайн приложения у тебя ВСЕГДА работает веб-сервер(IIS, Apache или что-либо другое)
2. Зачем тебе переЦЦа в лоб, если можно с боку подойти? - Делаешь вин-службу или любое(хоть консольное) приложение, которому передаешь необходимые параметры запуска приложения любым удобным для тебя способом, т.е., по сути, юзер из своей сессии передает лишь параметры запуска нужного ему приложения в службу(или другое приложение), которое запускает нужное ему(юзеру), приложение и при этом оно не привязано к веб-серверу и, соответственно, к сессии юзера, т.к. запустила его совершенно другая служба(приложение).

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