Multithread - Timeout Problem


DevX Home    Today's Headlines   Articles Archive   Tip Bank   Forums   

Results 1 to 2 of 2

Thread: Multithread - Timeout Problem

Threaded View

  1. #1
    Join Date
    Feb 2004
    Location
    Canada
    Posts
    6

    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

Similar Threads

  1. a very weird problem (AGAIN!!!)
    By Michael in forum ASP.NET
    Replies: 14
    Last Post: 02-24-2006, 08:54 AM
  2. Josephus Problem, problem.
    By aesoprock00 in forum Java
    Replies: 2
    Last Post: 01-28-2006, 06:18 PM
  3. Replies: 3
    Last Post: 11-16-2005, 06:15 PM
  4. Reliability Problem
    By elise in forum Java
    Replies: 0
    Last Post: 10-30-2002, 04:40 AM
  5. Replies: 0
    Last Post: 12-13-2001, 12: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
  •  
HTML5 Development Center
 
 
FAQ
Latest Articles
Java
.NET
XML
Database
Enterprise
Questions? Contact us.
C++
Web Development
Wireless
Latest Tips
Open Source


   Development Centers

   -- Android Development Center
   -- Cloud Development Project Center
   -- HTML5 Development Center
   -- Windows Mobile Development Center