简单的异步 Web 方法
为举例说明异步 Web 方法我从一个名为 LengthyProcedure 的简单同步 Web 方法开始其代码如下所示然后我们再看一看如何异步完成相同的任务LengthyProcedure 只占用给定的毫秒数
[WebService]
public class SyncWebService : SystemWebServicesWebService
{
[WebMethod]
public string LengthyProcedure(int milliseconds)
{
SystemThreadingThreadSleep(milliseconds);
return 成功;
}
}
现在我们将 LengthyProcedure 转换为异步 Web 方法我们必须创建如前所述的 BeginLengthyProcedure 函数和 EndLengthyProcedure 函数请记住我们的 BeginLengthyProcedure 调用需要返回一个 IAsyncResult 接口这里我打算使用一个委托以及该委托上的 BeginInvoke 方法让我们的 BeginLengthyProcedure 调用进行异步方法调用传递到 BeginLengthyProcedure 的回调函数将被传递到委托上的 BeginInvoke 方法从 BeginInvoke 返回的 IAsyncResult 将被 BeginLengthyProcedure 方法返回
当委托完成时将调用 EndLengthyProcedure 方法我们将调用委托上的 EndInvoke 方法以传入 IAsyncResult并将其作为 EndLengthyProcedure 调用的输入返回的字符串将是从该 Web 方法返回的字符串下面是其代码
[WebService]
public class AsyncWebService : SystemWebServicesWebService
{
public delegate string LengthyProcedureAsyncStub(
int milliseconds);
public string LengthyProcedure(int milliseconds)
{
SystemThreadingThreadSleep(milliseconds);
return 成功;
}
public class MyState
{
public object previousState;
public LengthyProcedureAsyncStub asyncStub;
}
[ SystemWebServicesWebMethod ]
public IAsyncResult BeginLengthyProcedure(int milliseconds
AsyncCallback cb object s)
{
LengthyProcedureAsyncStub stub
= new LengthyProcedureAsyncStub(LengthyProcedure);
MyState ms = new MyState();
mspreviousState = s;
msasyncStub = stub;
return stubBeginInvoke(milliseconds cb ms);
}
[ SystemWebServicesWebMethod ]
public string EndLengthyProcedure(IAsyncResult call)
{
MyState ms = (MyState)callAsyncState;
return msasyncStubEndInvoke(call);
}
}