powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / и снова Threads
7 сообщений из 7, страница 1 из 1
и снова Threads
    #33668781
Фотография Aeon Technologies
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASP.NET 1.1.

Ситуация: есть несколько тредов, которые постоянно работают. запуск происходит по Application_Start в gloabala.asax...

Задача: проконтролировать выполнение тредов, если какой-либо из них "умер", запустить его опять.

буду признателен за идеи.
...
Рейтинг: 0 / 0
и снова Threads
    #33668795
Humpy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По таймеру проходить по списку потоков и проверять их состояние.
А точно нужны потоки в таком виде?
...
Рейтинг: 0 / 0
и снова Threads
    #33669276
Фотография Aeon Technologies
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пасиб за ответ. отлично! а теперь главный вопрос. КАК?

что бы проверить тред, нужно иметь на него референс какой-то...

можно привести пример кода?

буду очень признателен.
...
Рейтинг: 0 / 0
и снова Threads
    #33669277
Фотография Aeon Technologies
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Humpy
А точно нужны потоки в таком виде?

треды поддерживают постоянный коннекшн по протоколу SMPP. если можно сделать лучше - буду признателен за помощь.
...
Рейтинг: 0 / 0
и снова Threads
    #33669362
Humpy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно создать список объектов, контролирующих свои потоки и пересоздающих их в случае чего.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
internal class ProtocolProcessor
{
    // данные для работы этого инстанса - адрес, порт, или что там надо.
    ...
    // сам поток
    private Thread localThread;

    public void CheckThreadStatus()
    {
        if (localThread == null ||
            localThread.ThreadState == ThreadState.Aborted ||
            localThread.ThreadState == ThreadState.Stopped)
        {
            // поток умер или не было его
            Thread thread = new Thread(...);
            thread.Start();
            localThread = thread;
        }
    }
}
а в таймере - что-то вроде
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// делаем shallow copy или локаем список - в зависимости от времени выполнения CheckThreadStatus

List<ProtocolProcessor> localList = new List<ProtocolProcessor>(protocolProcessors);

// бежим по списку и дергаем за проверялку
foreach (ProtocolProcessor processor in localList)
{
    processor.CheckThreadStatus()
}
...
Рейтинг: 0 / 0
и снова Threads
    #33669454
Фотография Aeon Technologies
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
благодарю всех кто ответил. вроде сделал, буду наблюдать за работой... сделал так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
public Timer timer;
protected Thread[] threads = new Thread[ 2 ];

protected void Application_Start(Object sender, EventArgs e)
{

			smppStart2( 0 , 7 , 2 );
			smppStart2( 1 , 7 , 3 );

			// check every  5  minutes
			timer = new Timer(new TimerCallback(threadChecker), null,  0 ,  300000 );



}


		void threadChecker(Object state)
		{
			ErrorsReport.Save("checking...");
			int GID =  0 ;
			int Mode =  0 ;

			try
			{
				for (int i =  0 ; i < threads.Length; i++)
				{
					switch(i)
					{
						case  0 :
							GID =  7 ;
							Mode =  2 ;
							break;
						case  1 :
							GID =  7 ;
							Mode =  3 ;
							break;
					}

					if(threads[i].IsAlive == true)
					{
						ErrorsReport.Save("thread " + i + " already running...");  
					}
					else
					{
						ErrorsReport.Save("thread " + i + " IS NOT running...");  
						smppStart2(i,GID,Mode);
					}
				}
			}
			catch(Exception x)
			{
				ErrorsReport.Save( " -----> " + x);
			}
			ErrorsReport.Save("checking END...");

		} 



		protected void smppStart2(int ID, int GID, int Mode)
		{
			// declare smpp
			SMPP mySMPP = new SMPP();
			mySMPP.GID = GID;
			mySMPP.ConnectionMode = Mode;
			
			// declare thread
			threads[ID] = new Thread(new ThreadStart(mySMPP.Runner));
			threads[ID].Name = System.Guid.NewGuid().ToString().Substring( 4 , 9 ).Trim().ToUpper() + "_smppGID_" + GID + "_" + Mode + ": ";  

			// set checking in the start
			ArrayList Gates = new ArrayList();	
			Gates.Add(GID.ToString());
			FileMark.Save(Gates);

			// start thread
			threads[ID].Start();
			
			//wait  2  secs
			Thread.Sleep( 2000 );

		}



если есть советы по оптимизации - буду рад.

еще раз всех благодарю.
...
Рейтинг: 0 / 0
и снова Threads
    #33669992
Humpy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если используется стандартный unhandled exception policy, то неотловленный exception в ErrorsReport.Save под 2.0 завалит все приложение.

Все некрасиво рухнет, если таймер сработает во время выгрузки домена (окончание работы приложения - из-за IIS 6.0 process recycling или еще чего).

Gates.Add(GID.ToString()) - при повторном запуске добавит еще раз ту же запись. Смотря по типу Gates, если не допускается дублирования, будет эксепшн, и до threads[ID].Start() дело не дойдет.

Старому объекту finalize точно не требуется перед созданием нового?

Все ж лучше создавать локальный объект, приводить его в чувство, и потом добавлять в список. Таким образом всегда есть уверенность что изначально все было хорошо.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / и снова Threads
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]