更新UI ASP.NET控件 - 异步(CallBack方法) - 调用WebService方法

时间:2016-10-26 18:41:42

标签: asp.net vb.net

以下是使用VB.NET在ASP.NET 1.1中编写的WebService的示例代码:

<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)。我正在将正确的价值观转化为&#34;结果&#34;变量。但它不是更新UI元素(Label1)。我知道原因。因为UI - MAIN - 线程不同于使用CALLBACK - WORKER - 线程的线程。你能为我提供示例代码,以便在Visual Studio.NET 2003中使用VB.NET更新UI(Label1)控件吗?

由于

1 个答案:

答案 0 :(得分:0)

这就是答案。这是消极的,但它是答案。您不能也不应该在ASP.NET Web窗体中执行此操作,因为Page循环通过众所周知的一组步骤进行。不应该在页面循环方法中完成任何异步/多线程编程。你绝对不应该让ASP.net线程睡觉。

您的Button1_Click是周期的一部分,当它执行时,ASP.net框架已经执行了其他操作。无论你异步调用什么,都会被遗忘。代码执行但值不会影响任何内容。

如果您尝试在ASP.net Web表单中实现异步行为,则需要包含一些将调用您的Web服务的客户端设备。我现在甚至不确定您使用的旧框架是否有更新面板或者有AJAX工具包。这就是你需要在没有页面重新加载的情况下实现它 - 你使用jQuery或其他东西来调用你的web服务。你在你的例子中尝试做的事情是死路一条。

严肃地说,开始使用新框架。至少3.5。