Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / и снова Threads / 7 сообщений из 7, страница 1 из 1
15.04.2006, 13:27
    #33668781
Aeon Technologies
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
и снова Threads
ASP.NET 1.1.

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

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

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

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

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

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

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

Код: 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
16.04.2006, 14:57
    #33669454
Aeon Technologies
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
и снова Threads
благодарю всех кто ответил. вроде сделал, буду наблюдать за работой... сделал так:

Код: 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
17.04.2006, 05:52
    #33669992
Humpy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
и снова Threads
Если используется стандартный unhandled exception policy, то неотловленный exception в ErrorsReport.Save под 2.0 завалит все приложение.

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

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

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

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


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