以下是使用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)控件吗?
由于
答案 0 :(得分:0)
这就是答案。这是消极的,但它是答案。您不能也不应该在ASP.NET Web窗体中执行此操作,因为Page循环通过众所周知的一组步骤进行。不应该在页面循环方法中完成任何异步/多线程编程。你绝对不应该让ASP.net线程睡觉。
您的Button1_Click
是周期的一部分,当它执行时,ASP.net框架已经执行了其他操作。无论你异步调用什么,都会被遗忘。代码执行但值不会影响任何内容。
如果您尝试在ASP.net Web表单中实现异步行为,则需要包含一些将调用您的Web服务的客户端设备。我现在甚至不确定您使用的旧框架是否有更新面板或者有AJAX工具包。这就是你需要在没有页面重新加载的情况下实现它 - 你使用jQuery或其他东西来调用你的web服务。你在你的例子中尝试做的事情是死路一条。
严肃地说,开始使用新框架。至少3.5。