什么是继续运行方法的最佳方法(what is the best way to keep running a method)
我必须继续运行24x7的方法。基本上,应用程序应该通过使用一些线程每秒处理40个数据。 我可以使用while或递归调用相同的方法。 但在这两个过程中,cpu使用率过高几乎95-100%。 我不能使用计时器,因为那时处理线程不能正常工作。 根据提供的解决方案,许多人谈论使用线程睡眠时使用while。 但是如果我使用线程休眠,那么它会在每次迭代中得到延迟。 我正在使用c#4.0。
我的问题:有没有更好的解决方案来减少CPU使用?
主要方法:
static void Main(string[] args) { while(true) { processData(); Thread.sleep(1000); // here i use a 1 second sleep just for give a breath of CPU. //But this one second sleep make me delay for enter data processing. // I am looking for a better solution that no sleep time will use and CPU usages will getting low. } } //Method should run always static string processData() { { // Open and close threads to process the data in every second. } // processData(); // it can be used for recursive method calling }
i have to keep running a method for 24x7.Basically the application should process 40 data in every second, by using some thread. i can use while or recursive call ling the same method. but in both process the cpu uses getting too high almost 95-100 %. i can't use timer because then the processing threads are not working properly. as per the provided solution many people talk to use the while with thread sleep. but if i use thread sleep then it getting delay in every iteration. i am using c# 4.0.
my question: is there any better solution to reduce the cpu uses?
the main method:
static void Main(string[] args) { while(true) { processData(); Thread.sleep(1000); // here i use a 1 second sleep just for give a breath of CPU. //But this one second sleep make me delay for enter data processing. // I am looking for a better solution that no sleep time will use and CPU usages will getting low. } } //Method should run always static string processData() { { // Open and close threads to process the data in every second. } // processData(); // it can be used for recursive method calling }
原文:https://stackoverflow.com/questions/19256946
最满意答案
您可以使用以下过程来执行您想要的操作。 它只需要你:
- 在调用proc之前创建Temp Table(您将Temp Table名称传递给proc)。 这允许临时表在当前作用域中使用,因为一旦proc结束/返回,就会删除在存储过程中创建的临时表。
- 在Temp Table中只放一个字段; 数据类型是无关紧要的,因为该字段将被删除(您将字段名称传递给proc)
[ 确保将proc名称更改为您喜欢的任何名称,但在后面的示例中使用了temp proc名称 ]
CREATE PROCEDURE #Abracadabra ( @TempTableName SYSNAME, @DummyFieldName SYSNAME, @TestMode BIT = 0 ) AS SET NOCOUNT ON DECLARE @SQL NVARCHAR(MAX) SELECT @SQL = COALESCE(@SQL + N', [', N'ALTER TABLE ' + @TempTableName + N' ADD [') + [Title] + N'] VARCHAR(100)' FROM #FieldList ORDER BY [ID] SET @SQL = @SQL + N' ; ALTER TABLE ' + @TempTableName + N' DROP COLUMN [' + @DummyFieldName + N'] ; ' IF (@TestMode = 0) BEGIN EXEC(@SQL) END ELSE BEGIN PRINT @SQL END GO
以下示例显示了正在使用的proc。 第一次执行是在测试模式下,它只打印将要执行的SQL。 第二次执行运行SQL和SELECT,然后EXEC显示字段是FieldList表中的字段。
/* -- HIGHLIGHT FROM "SET" THROUGH FINAL "INSERT" AND RUN ONCE -- to setup the example SET NOCOUNT ON; --DROP TABLE #FieldList CREATE TABLE #FieldList (ID INT, Title VARCHAR(50)) INSERT INTO #FieldList (ID, Title) VALUES (1, 'City') INSERT INTO #FieldList (ID, Title) VALUES (2, 'UserSuppliedFieldName') INSERT INTO #FieldList (ID, Title) VALUES (3, 'SomeField') */ IF (OBJECT_ID('tempdb.dbo.#Tmp') IS NOT NULL) BEGIN DROP TABLE #Tmp END CREATE TABLE #Tmp (Dummy INT) EXEC #Abracadabra @TempTableName = N'#Tmp', @DummyFieldName = N'Dummy', @TestMode = 1 -- look in "Messages" tab EXEC #Abracadabra @TempTableName = N'#Tmp', @DummyFieldName = N'Dummy', @TestMode = 0 SELECT * FROM #Tmp
@TestMode = 1
输出:ALTER TABLE #Tmp ADD [City] VARCHAR(100),[UserSuppliedFieldName] VARCHAR(100),[SomeField] VARCHAR(100); ALTER TABLE #Tmp DROP COLUMN [Dummy];
You can use the following proc to do what you are wanting. It just requires that you:
- Create the Temp Table before calling the proc (you will pass in the Temp Table name to the proc). This allows the temp table to be used in the current scope as Temp Tables created in Stored Procedures are dropped once that proc ends / returns.
- Put just one field in the Temp Table; the datatype is irrelevant as the field will be dropped (you will pass in the field name to the proc)
[Be sure to change the proc name to whatever you like, but the temp proc name is used in the example that follows]
CREATE PROCEDURE #Abracadabra ( @TempTableName SYSNAME, @DummyFieldName SYSNAME, @TestMode BIT = 0 ) AS SET NOCOUNT ON DECLARE @SQL NVARCHAR(MAX) SELECT @SQL = COALESCE(@SQL + N', [', N'ALTER TABLE ' + @TempTableName + N' ADD [') + [Title] + N'] VARCHAR(100)' FROM #FieldList ORDER BY [ID] SET @SQL = @SQL + N' ; ALTER TABLE ' + @TempTableName + N' DROP COLUMN [' + @DummyFieldName + N'] ; ' IF (@TestMode = 0) BEGIN EXEC(@SQL) END ELSE BEGIN PRINT @SQL END GO
The following example shows the proc in use. The first execution is in Test Mode that simply prints the SQL that will be executed. The second execution runs the SQL and the SELECT following that EXEC shows that the fields are what was in the FieldList table.
/* -- HIGHLIGHT FROM "SET" THROUGH FINAL "INSERT" AND RUN ONCE -- to setup the example SET NOCOUNT ON; --DROP TABLE #FieldList CREATE TABLE #FieldList (ID INT, Title VARCHAR(50)) INSERT INTO #FieldList (ID, Title) VALUES (1, 'City') INSERT INTO #FieldList (ID, Title) VALUES (2, 'UserSuppliedFieldName') INSERT INTO #FieldList (ID, Title) VALUES (3, 'SomeField') */ IF (OBJECT_ID('tempdb.dbo.#Tmp') IS NOT NULL) BEGIN DROP TABLE #Tmp END CREATE TABLE #Tmp (Dummy INT) EXEC #Abracadabra @TempTableName = N'#Tmp', @DummyFieldName = N'Dummy', @TestMode = 1 -- look in "Messages" tab EXEC #Abracadabra @TempTableName = N'#Tmp', @DummyFieldName = N'Dummy', @TestMode = 0 SELECT * FROM #Tmp
Output from
@TestMode = 1
:ALTER TABLE #Tmp ADD [City] VARCHAR(100), [UserSuppliedFieldName] VARCHAR(100), [SomeField] VARCHAR(100) ; ALTER TABLE #Tmp DROP COLUMN [Dummy] ;
相关问答
更多-
TCP/IP模型是一个________。[2023-10-02]
a -
下列中不属于面向对象的编程语言的是?[2022-05-30]
a -
动态创建临时表,插入临时表,然后选择(Dynamically create temp table, insert into temp table, and then select)[2022-07-08]
尝试用两个##命名表,这将创建一个全局临时表。 这可能是范围界定的问题,您可能正在使用exec创建表,但在它返回时它是不可见的。 Try to name the table with two ##, this will create a global temp table. It could be an issue with scoping, you might be creating the table with exec but it is not visible when it comes back. ... -
你不需要变量。 尝试这个: CREATE TABLE #tempTest ( one DATE, two ID, three NVARCHAR(60) ) INSERT INTO #tempTest SELECT Date, Id, Email FROM (SELECT [Date], [Id], [Email] FROM ( SELECT ROW_NUMBER() OVER (ORDER BY FI.Id ASC) AS 'RowNu ...
-
我怀疑我在这里陷入困境。 但是,我找到了一种不太乱的方法。 我将项目处理代码提取到另一个存储过程中,然后将其执行复合到动态“SELECT INTO”语句中 - 这样它在同一个执行实例中运行,因此可以访问在本地创建的临时表,那个例子: - SET @SQL = 'SELECT * INTO #TestTable FROM ' + @Table + ' WHERE ' + @WhereClause SET @SQL = @SQL + '; EXEC ReportProcess' EXECUTE sp_execu ...
-
MySql:如何使用动态select语句创建临时表?(MySql: how to create temp table by using dynamic select statement?)[2022-03-14]
使用SELECT语句创建表。 您还可以缩短WHERE子句。 declare strwhere varchar(30); if hour(now()) >= 16 and minute(now()) >=30 then set strwhere = ' CURDATE() + INTERVAL 1 DAY '; else set strwhere = ' CURDATE() '; end if; set @query = concat("CREATE TEMPORARY TABLE ta ... -
您可以使用以下过程来执行您想要的操作。 它只需要你: 在调用proc之前创建Temp Table(您将Temp Table名称传递给proc)。 这允许临时表在当前作用域中使用,因为一旦proc结束/返回,就会删除在存储过程中创建的临时表。 在Temp Table中只放一个字段; 数据类型是无关紧要的,因为该字段将被删除(您将字段名称传递给proc) [ 确保将proc名称更改为您喜欢的任何名称,但在后面的示例中使用了temp proc名称 ] CREATE PROCEDURE #Abracadabra ( ...
-
创建触发数据的临时表(create temp table of trigger data)[2022-04-18]
尝试在if之外创建临时表,如: SELECT TOP 0 * INTO #tmp FROM DELETED IF @ChangeType = 'D' INSERT INTO #tmp SELECT * FROM DELETED ELSE INSERT INTO #tmp SELECT * FROM INSERTED Try to create the temporary table outside the if, like: SELECT TOP 0 * INTO #tmp FROM DELET ... -
创建一个包含1列的临时表,然后动态运行动态SQL以将其他字段添加到临时表。 DECLARE @SQL varchar(max) CREATE TABLE #tmp(Id int) SET @SQL = 'ALTER TABLE #tmp ADD Column1 varchar(20)' EXEC(@SQL) Create a temp table with 1 column and then dynamically run dynamic SQL to add additional fields to ...
-
我设法基于现有架构创建临时表。 在我的网站上发布了解决方案 。 I managed to create a temp table based on an existing schema. Blogged the solution on my site.