2016-10-26 17 views
2

を呼び出すと、VB.NETを使用してASP.NET 1.1で書かれたWebサービスのためのサンプルコードです:更新UI ASP.NETコントロール - 非同期(コールバックアプローチ) - ここではWebサービスメソッド

<System.Web.Services.WebService(Namespace := "http://tempuri.org/WebService_Simple/Service1")> _ 
Public Class Service1 
    Inherits System.Web.Services.WebService 

    <WebMethod()> _ 
    Public Function Add(ByVal A As Integer, ByVal B As Integer) As Integer 
     System.Threading.Thread.Sleep(2000) 
     Return A + B 
    End Function 

End Class 

ここでは、クライアントコードは次のとおりです。

Public Class WebForm1 
    Inherits System.Web.UI.Page 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Dim proxy As New Service1 
     Dim ac As New AsyncCallback(AddressOf MyCallback) 
     Dim ar As IAsyncResult = proxy.BeginAdd(10, 20, ac, proxy) 
     System.Threading.Thread.Sleep(1000) 
    End Sub 

    Public Sub MyCallback(ByVal ar As IAsyncResult) 
     Dim proxy As Service1 = CType(ar.AsyncState, Service1) 
     Dim result As Integer = proxy.EndAdd(ar) 
     Label1.Text = "Result = " & result.ToString() 
    End Sub 

End Class 

私はVisual Studio.NET 2003(ASP.NET 1.1/VB.NET)を使用しています。私は "結果"変数に正しい値を得ています。しかし、UI要素(Label1)は更新されません。私はその理由を知っている。 UI - MAIN - スレッドはCALLBACK - WORKER - スレッドを使用しているものとは異なるためです。 Visual Studio.NET 2003でVB.NETを使用してUI(Label1)コントロールを更新するようにサンプルコードを提供できますか?

ありがとうございました

答えて

0

これは答えです。否定的ですが答えです。ページのサイクルはよく知られた一連の手順を実行するため、ASP.NET Webフォームではこれを行うことはできません。ページ・サイクル方式では、非同期/マルチスレッド・プログラミングは行わないでください。間違いなくASP.netスレッドをスリープさせるべきではありません。

Button1_Clickはサイクルの一部であり、実行すると、ASP.netフレームワークは既に別の処理を実行しています。そして、あなたが非同期に呼び出すものは、後ろに残されます。コードは実行されますが、値は何にも影響しません。

ASP.net Webフォームで非同期動作を実現するには、Webサービスを呼び出すクライアント側デバイスをいくつか含める必要があります。あなたが使用している古いフレームワークには、更新パネルやAJAXツールキットがあります。あなたがページリロードなしでそれを達成する必要がある方法です - あなたはjQueryなどを使用してWebサービスを呼び出します。あなたの例であなたがしようとしたことは、致命的な終わりです。

真剣に、新しいフレームワークの使用を開始してください。少なくとも3.5。

関連する問題