2012-03-17 20 views
0

我的代碼有什麼問題?我正在啓動按鈕單擊事件中的線程。我沒有收到任何錯誤,但不會觸發發送電子郵件。我的代碼有什麼問題?

Dim thread As New Thread(New ThreadStart(AddressOf sendEmail)) 
     thread.Start() 
     thread.IsBackground = True 
     thread.Priority = System.Threading.ThreadPriority.Normal 
     Response.Redirect(getRedirectionPath) 

Public Sub sendEmail() 

     Response.Redirect("~/Index") 

    End Sub 

它爲什麼不起作用?

更新:我得到的錯誤「線程已被中止」

更新:按照要求我已經上傳了整個代碼片段

Protected Sub btnLocalSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLocalSubmit.Click 
     'Dim _User As MembershipUser = Membership.GetUser(_userName) 
     'Dim _UserGUID As Object = _User.ProviderUserKey 


     Dim _con As New SqlConnection(ConfigurationManager.ConnectionStrings("CitizenJDBConnectionString").ConnectionString) 
     Dim _sqlComm As New SqlCommand("INSERT INTO LocalReport VALUES (@UserID,@ReportTitle,@Report,@State,@City,@Locality,'0','0',@Tags,@TimeStamp)", _con) 
     Try 

      _sqlComm.Parameters.Add("UserID", Data.SqlDbType.VarChar) 
      _sqlComm.Parameters("UserID").Value = _userName 

      _sqlComm.Parameters.Add("ReportTitle", Data.SqlDbType.VarChar) 
      _sqlComm.Parameters("ReportTitle").Value = txtLocalReportTitle.Text 

      _sqlComm.Parameters.Add("Report", Data.SqlDbType.VarChar) 
      _sqlComm.Parameters("Report").Value = ckLocalReport.Text 

      _sqlComm.Parameters.Add("State", Data.SqlDbType.VarChar) 
      _sqlComm.Parameters("State").Value = ddlState.SelectedValue 

      _sqlComm.Parameters.Add("City", Data.SqlDbType.VarChar) 
      _sqlComm.Parameters("City").Value = ddlCity.SelectedItem.Value 

      _sqlComm.Parameters.Add("Locality", Data.SqlDbType.VarChar) 
      _sqlComm.Parameters("Locality").Value = txtLocation.Text 

      _sqlComm.Parameters.Add("Tags", Data.SqlDbType.VarChar) 
      _sqlComm.Parameters("Tags").Value = txtLocalTags.Text 

      _sqlComm.Parameters.Add("TimeStamp", Data.SqlDbType.DateTime) 
      _sqlComm.Parameters("TimeStamp").Value = DateTime.Now 


      _con.Open() 
      _sqlComm.ExecuteNonQuery() 
      _con.Close() 

      Dim logic = New connections 
      logic.emailsToSend(User.Identity.Name, getURL, reportedBy) 
      'sendEmail() 
      Dim thread As New Thread(New ThreadStart(AddressOf sendEmail)) 
      thread.Start() 
      Response.Redirect(getRedirectionPath) 
     Catch ex As Exception 
      MsgBox(ex.Message) 
      Response.Write(ex.Message) 
     Finally 
      _con.Close() 
      _con.Dispose() 
      _sqlComm.Dispose() 

     End Try 
    End Sub 
    Public Sub sendEmail() 
     Dim _con As New SqlConnection(ConfigurationManager.ConnectionStrings("CitizenJDBConnectionString").ConnectionString) 
     Dim _sqlDataAdapter As New SqlDataAdapter("SELECT * FROM EmailSender", _con) 
     Dim _table As New System.Data.DataTable 


     Try 
      _con.Open() 
      _sqlDataAdapter.Fill(_table) 
      _con.Close() 

      For i As Integer = 0 To _table.Rows.Count 


       Dim AppPath As String = Request.PhysicalApplicationPath 

       Dim sr As New StreamReader(AppPath & "EmailTemplates/NewReport.txt") 
       Dim message As New MailMessage() 

       message.IsBodyHtml = True 

       message.From = New MailAddress("[email protected]") 

       message.To.Add(New MailAddress(_table.Rows(i).Item(1))) 

       'message.CC.Add(New MailAddress("[email protected]")) 

       message.Subject = "New User registration !" 

       message.Body = sr.ReadToEnd() 

       sr.Close() 

       message.Body = message.Body.Replace("<%ReporterName%>", _table.Rows(i).Item(3)) 

       message.Body = message.Body.Replace("<%ReportURL%>", _table.Rows(i).Item(2)) 

       Dim client As New SmtpClient() 
       client.Host = "smtp.tricedeals.com" 
       'smtp.gmail.com 
       client.Port = 25 
       client.UseDefaultCredentials = True 
       client.Credentials = New System.Net.NetworkCredential("[email protected]", "111111") 
       'smtp.EnableSsl = True 
       client.Send(message) 
       i += 1 
      Next 


     Catch ex As Exception 
      Response.Write(ex.Message) 
     End Try 
    End Sub 
+0

你能重寫你的代碼嗎?是任何方法中的thread.Start()方法?很高興看到所有文件 – igofed 2012-03-17 12:39:17

+0

@igofed我updaed錯誤我得到.. – user1150440 2012-03-17 12:40:55

+0

你爲什麼這樣做的Response.Redirect兩次? – Rich 2012-03-17 12:42:48

回答

3

的方法到Response.End結束的頁面執行並將執行轉移到應用程序事件管道中的Application_EndRequest事件。 Response.End後面的代碼行不會被執行。

此問題發生在的Response.Redirect和Server.Transfer的方法,因爲這兩種方法調用內部到Response.End。

要解決此問題,使用下列方法之一:

到Response.End對於,調用HttpContext.Current.ApplicationInstance.CompleteRequest方法,而不是要到Response.End繞過代碼執行到Application_EndRequest事件。

對於Response.Redirect,使用重載,Response.Redirect(String url,bool endResponse)爲endResponse參數傳遞false以禁止對Response.End的內部調用。例如: 的Response.Redirect( 「nextpage.aspx」,假);

如果您使用此解決方案,那麼就會執行Response.Redirect的代碼。 對於Server.Transfer,請改用Server.Execute方法。

閱讀全文Here