2012-12-09 27 views
1

你好朋友,我正在做一些在vb.net会计应用程序。所以我从我的应用程序做Web请求,但它阻止我的应用程序,直到它从网站得到响应,所以我决定使用线程。但我需要多次发出Web请求,所以当我再次启动线程时,它只是让我的应用程序没有响应并关闭。我也尝试通过互联网搜索,但没有与我的解决方案相匹配。我也尝试了我的代码的thread.suspend(),thread.abort(),thread.resume(),.....示例。在vb.net中再次运行相同的线程

Dim MyThread As System.Threading.Thread 

Private Sub CheckBoxX1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBoxX1.CheckedChanged 

    If CheckBoxX1.Checked = True Then 
     Try 
      MyThread = New System.Threading.Thread(AddressOf sendsms) 
      MyThread.Start() 
     Catch ex As Exception 
     msgbox(ex.message) 
     End Try 
    End If 
End Sub 

Private Sub sendsms() 

    Dim settings As New Form5 

    password = New System.Text.ASCIIEncoding().GetString(Convert.FromBase64String(password)) 

    Dim smsapi As String = Nothing 

    smsapi = ini.GetString("Setting_SMS", "api", smsapi) 

    settings.sendSMS(TextBoxX17.Text, msg, provider, username, password, smsapi) 

    MyThread.Suspend() 

End Sub 

当它第二次尝试它会崩溃我的应用程序。我的示例代码如下给出,请帮助我。

Public Class Form2 
    Private Sub ButtonX4_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonX4.Click 
     Dim ch As New System.Threading.Thread(AddressOf sendsms) 
     ch.IsBackground = True 
     ch.Start() 
    End Sub 

    Private Sub sendsms() 
     msg = msg.Replace("{name}", TextBoxX18.Text) 
     msg = msg.Replace("{totalprice}", TextBoxX4.Text) 
     msg = msg.Replace("{id}", TextBoxX21.Text) 
     msg = msg.Replace("{vehicalnum}", TextBoxX15.Text) 
     password = New System.Text.ASCIIEncoding().GetString(Convert.FromBase64String(password)) 
     Dim smsapi As String = Nothing 
     smsapi = ini.GetString("Setting_SMS", "api", smsapi) 
     Dim settings As New sendsms 
     settings.sendSMS(TextBoxX17.Text, msg, provider, username, password, smsapi) 
    End Sub 

End Class 



Public Class sendsms 
    Function sendSMS(ByVal numbers As String, ByVal msg As String, ByVal provider As String, ByVal username As String, ByVal password As String, ByVal api As String) 
     Try 
      If api = "" Then 
       api = "http://ultimatesmsapi.tk/sms.php?provider=provider1&username=username1&password=password1&numbers=numbers1&msg=msg1" 
      End If 

      api = api.Replace("username1", username) 
      api = api.Replace("password1", password) 
      api = api.Replace("msg1", msg) 
      api = api.Replace("numbers1", numbers) 
      api = api.Replace("provider1", provider) 
      Dim myReq As HttpWebRequest 
      myReq = DirectCast(WebRequest.Create(api), HttpWebRequest) 
      Dim myResp As HttpWebResponse = DirectCast(myReq.GetResponse(), HttpWebResponse) 
      Dim respStreamReader As New System.IO.StreamReader(myResp.GetResponseStream()) 
      Dim responseString As String = respStreamReader.ReadToEnd() 
      If responseString = 1 Then 
       msg = "SMS sent successfully.." 
      ElseIf responseString = -1 Then 
       msg = "Username and password is incorrect" 
      ElseIf responseString = -2 Then 
       msg = "Some fields are missing!" 
      ElseIf responseString = -3 Then 
       msg = "Error while sending sms!" 
      ElseIf responseString = -4 Then 
       msg = "Invalid Provider!" 
      ElseIf responseString = -5 Then 
       msg = "Number is DND activated!" 
      End If 
      respStreamReader.Close() 
      myResp.Close() 
     Catch ex As Exception 
      msg = "Problem in connection to server.." 
     End Try 
     MsgBox(msg) 
     Return msg 
    End Function 
End Class 
+0

CheckedChanged在'End Sub'之前缺少'End If'? – Neolisk

+0

我知道了。但我的问题是如何再次运行线程,或者我应该循环它,但如何使它停止并重新开始。 –

+0

我会创建一个新的线程,并运行它。或者你可以使用后台工作者。 – Neolisk

回答

1

这是你如何可以无限期地保持创建新主题:

Do 
    Dim MyThread As New System.Threading.Thread(AddressOf sendsms) 
    MyThread.Start() 
Loop 

请注意,如果不加控制这个循环会很快耗尽内存,和你的应用程序可能会崩溃。

+0

它不起作用,它只是使我的应用程序崩溃。我没有在循环中添加它,但是当我第二次调用它时会崩溃。 :( –

+0

@RahulSingh:你需要确保你的'''''''是线程安全的,我不知道'settings.sendSMS'的具体实现,但它可能不能用于多线程。另外我不认为你最终需要'MyThread.Suspend()',但这可能不会导致你的特定问题。 – Neolisk

+0

@RahulSingh:另一个原因可能是你正在非UI线程中创建一个表单[这是为什么你不想这样做,在大多数情况下](http://stackoverflow.com/questions/1040770/creating-controls-in-a-non-ui-thread)。 – Neolisk

0

你将需要重新设计这个。首先在checkbox.checkchanged上发送短信是一个坏主意,用户可能在完成之前检查并取消选中多次,提交按钮或类似的会更好。

接下来从一个线程访问ui元素是一个坏主意,类Form5听起来像是一个ui元素,以及TextBoxX17。

没有看到你的代码的其余部分,它不是真的可以给出具体的答案,但我会建议创建一个类来发送短信,启动一项任务。如果您需要此任务的反馈意见,请在您的主表单上提交活动并订阅。