DevX Home    Today's Headlines   Articles Archive   Tip Bank   Forums   

Results 1 to 2 of 2

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

Bookmarks

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


Top DevX Stories

Easy Web Services with SQL Server 2005 HTTP Endpoints
JavaOne 2005: Java Platform Roadmap Focuses on Ease of Development, Sun Focuses on the "Free" in F.O.S.S.
Wed Yourself to UML with the Power of Associations
Microsoft to Add AJAX Capabilities to ASP.NET
IBM's Cloudscape Versus MySQL


Sponsored Links