0

ユーザーを検証する WebService があります。しかし、検証を受け取るまで、Windows はプログラムが応答していないと非難します。スレッド、非同期で試しましたが、成功しませんでした。彼が Web サービスに接続している間、画面に接続メッセージが表示されます。

label1.Text = "Connecting";
Service.Service1 ws = new Service.Service1(); //start WebService
bool login = ws.login(username, password); //Validate login
if (login) {... //If login is true
4

2 に答える 2

1

スレッドで試しましたが、

試したことを実際に示していないため、コードの何が問題なのかを判断するのは困難です。これがデスクトップ アプリケーションの場合は、BackgroundWorker.

例えば:

private void LoginButtonClick(object sender, EventArgs e)
{
    label1.Text = "Connecting";
    var bw = new BackgroundWorker();
    bw.DoWork += Login;
    bw.RunWorkerCompleted += LoginCompleted;
    bw.RunWorkerAsync();
}

private void Login(object sender, DoWorkEventArgs e)
{
    Service.Service1 ws = new Service.Service1();
    bool success = = ws.login(username, password);
    e.Result = success;
}

private LoginCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    bool success = (bool)e.Result;
    if (success)
    {
        label1.Text = "You have successfully logged in";
    }
    else
    {
        label1.Text = "Wrong username and password";
    }
}

また、デスクトップ アプリケーションでバックグラウンド スレッドを使用する場合も注意が必要です。このバックグラウンド スレッド内で UI コントロールにアクセスしないようにする必要があります。これは常にメイン UI スレッドで行う必要があります。

于 2013-02-23T17:46:52.247 に答える
0

Service1.Service には「Beginlogin」/「Endlogin」メソッドがありますか? 通常、WSDL への参照を追加すると、この非同期バージョンも自動作成されます....

その場合は、このメソッドを使用してください。別のスレッドをスピンアップするよりもはるかにクリーンです。それらの使用方法の良い例については、http://www.codeproject.com/Articles/2476/Asynchronous-Communication-with-NET-WebServicesを参照してください。

于 2013-02-23T17:57:11.543 に答える