1

こんにちは友人私は vb.net で作成されたいくつかの会計アプリケーションに取り組んでいます。だから私は自分のアプリケーションからWebリクエストを作成していますが、Webからの応答が得られるまでアプリケーションをブロックするので、スレッドを使用することにしました。しかし、Webリクエストを複数回行う必要があるため、スレッドを再度開始すると、アプリケーションが応答しなくなり、終了します。また、インターネット全体を検索してみましたが、私のソリューションに一致するものはありません。また、thread.suspend()、thread.abort()、thread.resume()、.....私のコードのサンプルも試しました。

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

2回目に試すと、アプリケーションがクラッシュします。私のサンプルコードを以下に示します。誰か助けてください。

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
4

2 に答える 2

1

これは、新しいスレッドを無期限に作成し続ける方法です。

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

制御されていない場合、このループはすぐにメモリを使い果たし、アプリケーションがクラッシュする可能性があることに注意してください。

于 2012-12-10T00:18:54.047 に答える
0

これを再設計する必要があります。最初にcheckbox.checkchangedでSMSを送信するのは悪い考えです。ユーザーは、完了する前に何度もチェックとチェックを外す可能性があります。送信ボタンなどの方が適しています。

次にスレッドからui要素にアクセスするのは悪い考えであり、Form5クラスはTextBoxX17とともに私には確かにui要素のように聞こえます。

コードの残りの部分を見ずに特定の答えを出すことは実際には不可能ですが、タスクを開始するSMSを送信するクラスを作成することをお勧めします。このタスクからのフィードバックが必要な場合は、イベントを発生させ、メインフォームでサブスクライブしてください。

于 2012-12-10T06:56:41.010 に答える