Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CLR Extended SP и многозадачность  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Привет!

MSSQL 2008 R2 x64, VS 2010 Pro

Изучаю возможность стартовать несколько параллельных потоков внутри хранимой процедуры написанной на .NET.

Уперся в то, что не стартуют потоки. Т.е. все корректно с точки зрения синтаксиса, ассембли регистрируется как UNSAVE, а потоки не стартует. В отладчике благополучно выполняет myThread.Start() и все. Поток, на самом деле не стартует.

Порыл в гугле, нашел только сообщения о том, что не я один с этим бьюсь и больше ничего.

Есть что мне посоветовать?
10 май 11, 12:49    [10628587]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Glory
Member

Откуда:
Сообщений: 104751
Yuri Abele
В отладчике благополучно выполняет myThread.Start() и все. Поток, на самом деле не стартует.

И как же вы тогда узнаете, что "поток не стартует" ?
10 май 11, 13:10    [10628710]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Glory
Yuri Abele
В отладчике благополучно выполняет myThread.Start() и все. Поток, на самом деле не стартует.

И как же вы тогда узнаете, что "поток не стартует" ?


Ну так он же не пустой, в нем код есть. И этот код требует времени на выполнение, а после отработки меняет что-то.
И после старта всех потоков в цикле проверяет их состояние, и пока они не отработают, не идет дальше.

Так вот оно мгновенно вылетает рапортуя, что все закончилось, но при этом ничего не было изменено :-/

P.S. Пока писал мысль появилась, что само по себе редкость :-) - пойду ее проверю
10 май 11, 13:57    [10629102]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Glory
Member

Откуда:
Сообщений: 104751
Yuri Abele

Так вот оно мгновенно вылетает рапортуя, что все закончилось, но при этом ничего не было изменено :-/

Т.е. вы визуально проверяете, как работает myThread.Start() ?
10 май 11, 14:04    [10629192]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
"Поток не запускается" и "поток ничего не делает" - это две разные вещи.
10 май 11, 14:06    [10629212]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Glory
Yuri Abele
Так вот оно мгновенно вылетает рапортуя, что все закончилось, но при этом ничего не было изменено :-/

Т.е. вы визуально проверяете, как работает myThread.Start() ?

Не совсем. Внутри потоков анонимный делегат, в котором стоит Sleep(10000).

После запуска нескольких потоков я (дабы быть уверенным) жду три секунды (Sleep(3000)) и после этого проверяю состояние потоков - они не запущены.

Окно отладчика Threads тоже показывает только один поток - основной.
10 май 11, 14:13    [10629291]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Гавриленко Сергей Алексеевич
"Поток не запускается" и "поток ничего не делает" - это две разные вещи.

Поток не запускается - см. предыдущий постинг
10 май 11, 14:14    [10629300]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Yuri Abele
Гавриленко Сергей Алексеевич
"Поток не запускается" и "поток ничего не делает" - это две разные вещи.

Поток не запускается - см. предыдущий постинг


а если этот же код в обычное приложение перенести, работают все потоки?
10 май 11, 14:41    [10629561]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Winnipuh
Yuri Abele
пропущено...

Поток не запускается - см. предыдущий постинг


а если этот же код в обычное приложение перенести, работают все потоки?

Да, я проверял.
Я не буду больше абстрактным - прикладываю тестовый проект.

Для его работы надо на localhost разрешить CLS и создать базу данных [TestCLRMultyThreading]:

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON

GO
USE master

GO
DECLARE @clr TABLE(
	name NVarChar(50) NOT NULL,
	minimum Int NOT NULL,
	maximum Int NOT NULL,
	config_value Int NOT NULL,
	run_value Int NOT NULL)
INSERT INTO @clr EXEC sp_configure 'clr enabled' --, 1
IF (SELECT run_value FROM @clr) != 1 BEGIN
	EXEC sp_configure 'clr enabled', 1
	RECONFIGURE
END

GO
CREATE DATABASE [TestCLRMultyThreading];

GO
USE [TestCLRMultyThreading]

GO
sp_changedbowner 'sa'

GO
ALTER DATABASE [TestCLRMultyThreading] SET TRUSTWORTHY ON;


К сообщению приложен файл (TestCLRMultyThreading.zip - 24Kb) cкачать
10 май 11, 15:02    [10629738]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Yuri Abele
прикладываю тестовый проект:
using System.Threading;
using Microsoft.SqlServer.Server;

namespace TestCLRMultyThreading
{
	public static class Query
	{

		[SqlProcedure(Name = "TestParallelExecution")]
		public static void ExecuteParallel()
		{
			SqlContext.Pipe.Send("********** Procedure started **********");

			Thread thread1 = new Thread(delegate()
			{
				SqlContext.Pipe.Send("********** Thread #1 started **********");
				Thread.Sleep(10000);
			});
			thread1.Name = "TestThread_1";
			Thread thread2 = new Thread(delegate()
			{
				SqlContext.Pipe.Send("********** Thread #2 started **********");
				Thread.Sleep(10000);
			});
			thread2.Name = "TestThread_2";

			thread1.Start();
			thread2.Start();

			Thread.Sleep(10000);

			while (thread1.IsAlive || thread2.IsAlive)
				Thread.Sleep(1000);

			SqlContext.Pipe.Send("********** Procedure finished **********");
		}

	}
}
Что-то я не вижу обработки ошибок. И кто вам сказал что SqlContext.Pipe.Send потоко-безопастно?

Передавайте данные сначало в основной поток, а не сразу скулю.
10 май 11, 15:51    [10630232]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Yuri Abele
Winnipuh
а если этот же код в обычное приложение перенести, работают все потоки?

Да, я проверял.
Я не буду больше абстрактным - прикладываю тестовый проект.
Простейшая отладка вашего кода показывает, что внутри потоков возникает исключение.
10 май 11, 15:58    [10630285]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Yuri Abele
Привет!

MSSQL 2008 R2 x64, VS 2010 Pro

Порыл в гугле, нашел только сообщения о том, что не я один с этим бьюсь и больше ничего.

Есть что мне посоветовать?


на С++ была похожая проблема - решилась так:

       uintptr_t ThreadHandle = _beginthreadex( &sa, NULL, fnUserThread, NULL, CREATE_SUSPENDED, &ThreadId);

       if( ThreadHandle != NULL && ThreadId > 0 )
       {
           DWORD dwResult = ResumeThread(reinterpret_cast<HANDLE>(ThreadHandle));

все другие виды запусков сервер 2008 подавлял
10 май 11, 21:56    [10632029]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Lepsik
все другие виды запусков сервер 2008 подавлял
В данном случае сервер 2008 ничего не подавляет, потоки прекрасно запускаются. ТС же выложил код, там всё нормально работает.
10 май 11, 22:09    [10632055]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Mnior
Yuri Abele
прикладываю тестовый проект:
using System.Threading;
using Microsoft.SqlServer.Server;

namespace TestCLRMultyThreading
{
	public static class Query
	{

		[SqlProcedure(Name = "TestParallelExecution")]
		public static void ExecuteParallel()
		{
			SqlContext.Pipe.Send("********** Procedure started **********");

			Thread thread1 = new Thread(delegate()
			{
				SqlContext.Pipe.Send("********** Thread #1 started **********");
				Thread.Sleep(10000);
			});
			thread1.Name = "TestThread_1";
			Thread thread2 = new Thread(delegate()
			{
				SqlContext.Pipe.Send("********** Thread #2 started **********");
				Thread.Sleep(10000);
			});
			thread2.Name = "TestThread_2";

			thread1.Start();
			thread2.Start();

			Thread.Sleep(10000);

			while (thread1.IsAlive || thread2.IsAlive)
				Thread.Sleep(1000);

			SqlContext.Pipe.Send("********** Procedure finished **********");
		}

	}
}
Что-то я не вижу обработки ошибок. И кто вам сказал что SqlContext.Pipe.Send потоко-безопастно?

Передавайте данные сначало в основной поток, а не сразу скулю.

Дык это, если сразу не было заметно, тестовый проект - минут за 10 слепил.
В оригинальном проекте и try-catch-finally и lock для SqlContext.Pipe.Send - хотя, наверное лучше во внешний поток передавать.
просто кода в этом случае будет намного больше - не хотелось загромождать форум.
11 май 11, 13:50    [10635070]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
alexeyvg
Yuri Abele
пропущено...

Да, я проверял.
Я не буду больше абстрактным - прикладываю тестовый проект.
Простейшая отладка вашего кода показывает, что внутри потоков возникает исключение.

А вот тут пожалуйста поподробнее!
Рискну предположить, что Вы код в другой проект перенесли, который больше не хранимая процедура, я прав?
11 май 11, 13:52    [10635093]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
alexeyvg
Lepsik
все другие виды запусков сервер 2008 подавлял
В данном случае сервер 2008 ничего не подавляет, потоки прекрасно запускаются. ТС же выложил код, там всё нормально работает.

Так работает или нет? (TC - это Topic Creator?)
11 май 11, 13:53    [10635099]     Ответить | Цитировать Сообщить модератору
 Re: CLR Extended SP и многозадачность  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
Yuri Abele
alexeyvg
пропущено...
Простейшая отладка вашего кода показывает, что внутри потоков возникает исключение.

А вот тут пожалуйста поподробнее!
Рискну предположить, что Вы код в другой проект перенесли, который больше не хранимая процедура, я прав?
Нет, я сделал всё по вашей инструкции - и базу создал, и ваш солюшен.

Разумеется, эффект такой-же как у вас (т.е. данные не выводятся), но это и понятно - вам же уже сказали, что SqlContext.Pipe.Send работать не должен.

При этом простая отладка показывает, что потоки нормально запускаются.

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

Т.е. у вас потоки нормально запускаются, SqlContext.Pipe.Send вызывает ошибку и потоки загибаются (или остаются в зависшем состоянии, не помню точно, что там должно происходить).

Yuri Abele
Так работает или нет? (TC - это Topic Creator?)
Ага, TC - топик стартер.

Работает, если отвечать на первоначальный вопрос и на ваш комментарий - запускаются ли потоки в CLR-процедуре.

при этом программа не работает как задумано, так как в коде ошибки.
11 май 11, 15:54    [10636420]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить