-
Multithread - Timeout Problem
Hello,
I have simple ASP.net web form. With a simple click on a button i need to call a the Multithread process in order to execute my querry in SQL Server DB. I know that my querry willl take up to 45 min to be executed. While the process is running i need to display some status information like: Starting time, Time elapsed, % of completed...
So after running the process i got the following error message: "Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."
So i have 2 problems to fix:
Avoid getting timeout while processing/calling the stored procedure. I tried to add cmd.CommandTimeout = 1000 but it didn't work out!
Display correctly Time elapsed and % Completed while processing.
I used the code on this link to build my code: http://www.sitepoint.com/print/threading-asp-net/
Thank for your help
Paul
Here's my code in the main form:
Code:
Imports System.Threading
Partial Public Class Inventory
Inherits System.Web.UI.Page
Private v_thread As Thread
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
Me.rdResults.Visible = False
End If
If Session("ProcessStart") = True Then
Response.Redirect("archive_style_result.aspx")
End If
' --------------------------------------------------------------------
' Add this new section in order to display the Status of the archiving while proceeding
' --------------------------------------------------------------------
SyncLock Session.SyncRoot
' Initialize pour session variables to hold our results
Session("ProcessStart") = False
Session("Complete") = False
Session("ProcessStartAt") = ""
Session("ProcessEndAt") = ""
Session("TotalTime") = ""
Session("Status") = ""
Session("Phrase") = ""
End SyncLock
End Sub
Protected Sub BtnRebuild_Click(ByVal sender As Object, ByVal e As EventArgs)
If Page.IsPostBack Then
lblErrorMessage.Text = ""
lblErrorMessage.Visible = False
pnlErrorMessage.Visible = False
Try
Dim v_thread As New System.Threading.Thread(AddressOf Me.RebuildInventory)
'v_thread = New Thread(AddressOf Me.ArchiveStyle1)
v_thread.IsBackground = True
v_thread.Priority = ThreadPriority.Lowest
v_thread.Start()
'now redirect to the results page
Response.Redirect("archive_style_result.aspx")
lblErrorMessage.Text = "Rebuild inventory is in process... This may take some times. <BR>Please verify later on your Global Inventory. "
lblErrorMessage.Visible = True
pnlErrorMessage.Visible = True
Catch ex As Exception
lblErrorMessage.Text = ex.Message.ToString
lblErrorMessage.Visible = True
pnlErrorMessage.Visible = True
End Try
End If
End Sub
Sub RebuildInventory()
Try
Dim v_string As String = ""
Dim i As Integer = 0
Dim v_start_time_ticks As Long = 0
Dim v_string_start_time As String = ""
Dim v_total_sleep_time As Double = 0.0
Dim v_total_thread_life As Integer = 2
Dim v_length As Integer = 100000
' log our start time, in ticks, and in Long Date format
v_start_time_ticks = DateTime.Now.Ticks
v_string_start_time = DateTime.Now
' Get phrase
v_string = "Archiving style in process ..."
'convert users time from seconds to milliseconds
v_total_sleep_time = 1000.0
v_total_sleep_time = v_total_sleep_time * CInt(v_total_thread_life)
v_total_sleep_time = (v_total_sleep_time / v_length)
' ------------------------------------------------------------------------
Dim v_connection As SqlConnection = Nothing
Dim v_sql_connection_string As String = ConfigurationManager.ConnectionStrings("LocalSqlServer").ConnectionString
v_connection = New SqlConnection(v_sql_connection_string)
Try
SyncLock Session.SyncRoot
Session("ProcessStart") = True
Session("ProcessStartAt") = v_string_start_time
Session("Phrase") = v_string
End SyncLock
' Open Connection
v_connection.Open()
Dim cmd As SqlCommand
'Insert/Update data in database
cmd = New SqlCommand("pr_update_warehouse_status_populate_all", v_connection)
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandTimeout = 1000
With cmd.Parameters.AddWithValue("@p_transaction_code", "-1")
.Size = 20
.SqlDbType = SqlDbType.NVarChar
.Direction = ParameterDirection.Input
End With
With cmd.Parameters.AddWithValue("@p_error_no", "")
.Size = 20
.SqlDbType = SqlDbType.NVarChar
.Direction = ParameterDirection.Output
End With
With cmd.Parameters.AddWithValue("@p_error_txt", "")
.Size = 1000
.SqlDbType = SqlDbType.NVarChar
.Direction = ParameterDirection.Output
End With
' This method will put our thread to sleep for the specified number of milliseconds.
' Without the sleep, this method would execute too fast to see the thread working.
Thread.Sleep(v_total_sleep_time)
cmd.ExecuteNonQuery()
Catch ex As Exception
Throw ex
Finally
If Not v_connection Is Nothing Then
v_connection.Close()
v_connection = Nothing
End If
End Try
'we use synclock to block any other thread from accessing
'session variables while we are changing their values.
SyncLock Session.SyncRoot
Session("Status") = Format((i / (v_length - 1)) * 100, "#0.00") & "% complete."
Session("TotalTime") = Format((DateTime.Now.Ticks - v_start_time_ticks) / 10000000, "#0.00") & " sec."
Session("Phrase") = v_string
End SyncLock
' Our method is complete, so set the Session variables accordingly
SyncLock Session.SyncRoot
Session("ProcessStartAt") = v_string_start_time
Session("ProcessEndAt") = DateTime.Now
Session("Status") = "100% completed"
Session("Complete") = True
Session("ProcessStart") = False ' End of the process
Session("Phrase") = "Archiving style is completed!"
End SyncLock
'cmd.ResetCommandTimeout()
Catch ex As Exception
Throw ex
End Try
End Sub
End Class
Here's my code in the result form:
Code:
Partial Class _ArchiveStyleResult
Inherits System.Web.UI.Page
Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Try
'Put user code to initialize the page here
'check the value of Session("Completed"), if it is True, stop writing
Me.lblErrorMessage.Text = ""
Me.lblErrorMessage.Visible = False
Me.pnlErrorMessage.Visible = False
If Session("Complete") <> True Then
' Make sure session variables are enabled, if not warn user
If Session("Complete") <> False Then
' Error with session variable, Session("Complete") is not True or False
lblComplete.Text = "Error with Session('Complete')"
Else
' Set page to auto refresh page every 2 seconds, until thread is done
Response.Write("<META HTTP-EQUIV=Refresh CONTENT='10; URL='>")
SyncLock Session.SyncRoot
lblProcessStartAt.Text = Session("ProcessStartAt")
lblProcessEndAt.Text = Session("ProcessEndAt")
lblStatus.Text = Session("Status")
lblTotalTime.Text = Session("TotalTime")
lblPhrase.Text = Session("Phrase")
lblComplete.Text = Session("Complete")
End SyncLock
End If
Else
' Thread is complete, stop writing refresh tag, and display results
SyncLock Session.SyncRoot
lblProcessStartAt.Text = Session("ProcessStartAt")
lblProcessEndAt.Text = Session("ProcessEndAt")
lblStatus.Text = Session("Status")
lblTotalTime.Text = Session("TotalTime")
lblPhrase.Text = Session("Phrase")
lblComplete.Text = Session("Complete")
End SyncLock
End If
Catch ex As Exception
lblErrorMessage.Text = ex.Message.ToString
lblErrorMessage.Visible = True
pnlErrorMessage.Visible = True
End Try
End Sub
End Class
Last edited by Hack; 09-04-2009 at 07:08 AM.
Reason: Added Code Tags
-
I think that cmd.CommandTimeout should be in Seconds so 1000 is only 16 mins - you could try setting it to 0 which will disable the timeout to see if it works, but as you know best practice is to always have a timeout
Last edited by JGRobinson; 09-04-2009 at 12:31 PM.
Reason: Amended answer
Hope this helps
Graham
Before you criticize someone, you should walk a mile in their shoes. That way, when you criticize them, and if they get mad, you are a mile away and you have their shoes ;-)
http://www.grahamrobinsonsoftware.com
Similar Threads
-
By Michael in forum ASP.NET
Replies: 14
Last Post: 02-24-2006, 09:54 AM
-
By aesoprock00 in forum Java
Replies: 2
Last Post: 01-28-2006, 07:18 PM
-
By JohnsonGPS in forum C++
Replies: 3
Last Post: 11-16-2005, 07:15 PM
-
Replies: 0
Last Post: 10-30-2002, 05:40 AM
-
Replies: 0
Last Post: 12-13-2001, 01:06 PM
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Development Centers
-- Android Development Center
-- Cloud Development Project Center
-- HTML5 Development Center
-- Windows Mobile Development Center
|