当前位置: 首页 > 编程语言 > C#

C#.NETWeb服务异步分享

时间:2023-04-10 17:30:26 C#

C#.NETWeb服务异步我正在尝试使用执行一些非常冗长任务的Web服务来实现API。我基本上希望Web服务启动一个执行冗长任务的线程,并保持运行直到完成。问题是因为它是一个API,我希望它是跨平台的。所以我的问题如下:这是一个很好的起点:http://msdn.microsoft.com/en-us/library/aa480516.aspx如果您实施此模式,从客户端的角度来看,没有任何变化。您可以实现第二个Web方法来检查在异步方法中排队的任何正在运行的作业的状态。从演示代码中进行了一些修改,以方便您了解需要执行的操作(我不希望这会编译):[WebService]publicclassAsyncWebService:System.Web.Services.WebService{publicdelegatestringLengthyProcedureAsyncStub(intstatesseconds,MyStatemilliseconds,MyStatemilliseconds);publicstringLengthyProcedure(intmilliseconds,MyStatestate){while(state.Abort==false){//做你的工作。定期检查中止}returnstate.Abort?“中止”:“成功”;}//这个状态对象是你可以用来跟踪你的方法调用的对象//你需要将它存储在一个线程安全的容器中。在Begin方法中将其添加到容器中,在end方法中将其移除。当它在容器中时,其他Web方法可以找到它并使用它来监视或停止正在执行的作业。publicclassMyState{publicGuidJobID=Guid.NewGuid();公共对象previousState;公共LengthyProcedureAsyncStubasyncStub;公共布尔中止=假;}[System.Web.Services.WebMethod]publicIAsyncResultBeginLengthyProcedure(int毫秒,AsyncCallbackcb,objects){LengthyProcedureAsyncStubstub=newLengthyProcedureAsyncStub(LengthyProcedure);MyStatems=newMyState();ms.previousState=s;ms.asyncStub=存根;//添加到服务范围容器returnstub.BeginInvoke(,cb,ms);}[System.Web.Services.WebMethod]publicstringEndLengthyProcedure(IAsyncResultcall){//从服务范围容器中移除MyStatems=(MyState)call.AsyncState;返回ms.asyncStub.EndInvoke(call);}[WebMethod]publicvoidStopJob(GuidjobID){//在服务范围容器中查找作业MyStatestate=GetStateFromServiceWideContainer(jobID);state.Abort=true;就客户端而言,他们正在调用LengthyProcedure的Web方法,该方法在作业完成之前不会返回OK,备份一秒钟。如果您希望人们能够调用异步,那么他们就可以控制您,而您只需要响应即可。如果你想在你这边做异步工作,那么你需要构建一个不同的模型。一种模式是设置一个方法来调用作业,然后设置另一个方法来查看作业的状态。第一个方法返回某种类型的令牌/id,可用于检查另一个调用的状态。然后你有第三种方法来获得结果。这都是客户驱动的。理论上,你可以建立一个回调机制,但客户端需要有一种获取答案的方式,也就是他们自己的服务。这在本质上更复杂,更不像“公共API”,但它适用于客户端。系统异质性不应成为一个因素。而且,您可以构建这两种模式,因此具有接受答案的Web服务的客户端可以触发并忘记,而其他客户端则进行轮询。轮询的一个缺点是你增加了更多的权重,所以适当地设置期望,并准备杀死任何这样做的人:while(thread.NoComplete()){pollTheCrapOutofService();}如果您可以绕过异构环境(开放标准等),并且可以强制使用.NET,那么就像Craig提到的那样,您还有其他选择。为此,我们使用AppFabricWorkflow服务。它们作为WCF服务公开,因此任何可以进行SOAP调用的东西——或任何其他支持的WCF传输——都可以调用它们。持久性是免费的(如果您设置了SQLServer),监视和管理也是免费的,并且会自动生成.NET客户端。一个潜在的缺点:您需要IIS7+和.NET4。是否可以在不需要客户端的情况下在.NETFramework上进行异步调用?(看起来初始/结束帧需要我返回一个.NETIASyncResult对象)如果是这样,如何?向您的客户公开RESTAPI。然后,您只需要一层代码即可在.NET异步对象和REST服务之间进行转换。既然web服务中没有状态保存,那线程能不能稍后再恢复呢?您可以公开一个返回操作状态的REST方法,以及另一个取消异步操作的REST方法。对于长时间运行的操作,我通常会设置一个带有ThreadPool的Windows服务。您可以在那里公开您的IAsyncAPI。在IIS服务器上公开RESTAPI的最简单方法是使用简单的ASP.NETMVC应用程序。您可以直接从控制器方法执行长时间运行的异步进程。以上就是《C#学习教程:C#.NETWeb服务异步分享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: