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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как(где) создать поток, который работает, после окончания проложения? 
:(
    Опции темы
mr.DUDA
Дата 11.7.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



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

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

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


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 11.7.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



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

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

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

 
PM MAIL WWW ICQ   Вверх
Pankon
Дата 11.7.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(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 
 
PM MAIL   Вверх
ivashkanet
Дата 11.7.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



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

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

Запущенное, работающее в режиме ожидания. 
Получило задание --- запустило поток --- ждет.
Получило ответ от потока --- обработало ---- опять ждет. 
PM MAIL WWW ICQ   Вверх
Pankon
Дата 11.7.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ivashkanet @  11.7.2006,  17:26 Найти цитируемый пост)
Запущенное, работающее 
 Я так и не понял: АСП-приложение, вин-приложение, вин-сервисе (свой вариант)
 
PM MAIL   Вверх
ivashkanet
Дата 11.7.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Как вижу ситуацию я:
АСП-приложение --- пишет в базу (не могу придумать нормальный способ взаимодействия двух разных приложений smile ). Написало --- забыло.
Win-сервис (зачем доп память на визуализацию жрать). Временами сканирует базу на наличие новой заявки.
Есть заявка --- запускаем поток на ее обработку --- ждем новые заявки.
Получили ответ от потока --- обрабатываем ---- опять ждет. 
Вот так. Что непонятно? 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 11.7.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



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

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


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 11.7.2006, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



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

У меня тоже были такие мысли, а потом подумал (с подачи Pankon). А не закроется поток, при закрытии сессии
 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 11.7.2006, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



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

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


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 11.7.2006, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mr.DUDA @  11.7.2006,  17:57 Найти цитируемый пост)
в рамках ASP.NET-овского приложения стартануть
 а как же 
Цитата(Pankon @  11.7.2006,  13:31 Найти цитируемый пост)
(Серверный application тоже может быть остановлен...)
 
PM MAIL   Вверх
mr.DUDA
Дата 12.7.2006, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



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

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


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 12.7.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хорошо.

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

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

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

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

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



 
PM MAIL   Вверх
mr.DUDA
Дата 12.7.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



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()
    {
    }
}


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

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  TestWebSite.zip 4,76 Kb


--------------------
user posted image
PM MAIL WWW   Вверх
Pankon
Дата 12.7.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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


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

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

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

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

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

Это сообщение отредактировал(а) Pankon - 12.7.2006, 15:06
PM MAIL   Вверх
mr.DUDA
Дата 12.7.2006, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Цитата(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. 


--------------------
user posted image
PM MAIL WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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