使用WebService避免线程并行(异步)任务我有一个并行执行的任务;例如,异步打印用户选择的文件。一种方法可能是使用工作线程。但是考虑到成千上万的请求涌入Web服务器的情况,并且应用程序产生的另一个线程用于打印听起来很可怕。如果所有并发用户都开始打印怎么办?所以我想避免工作线程的原因。为了解决这个问题,我将代码移到了Web服务中;我正在调用PrintAsync()方法,并且我正在订阅OnPrintComplete以获得通知。现在,我可以发送任意数量的打印件,而不必担心asp.net线程不足或阻塞请求。我知道Web服务在内部使用线程,但这是一个IOCP线程,这意味着它不会打扰asp.net工作线程。我想不出可能的缺点,除了它将是一个网络服务。这是一个好方法吗?处理此功能的更好替代版本是什么?所以你已经描述了你是如何在客户端进行异步调用的,实际上我会问一些关于你实际上是如何完全异步的问题,但你的问题似乎更多的是关于如何可能在服务方面吧?如果您在服务操作中执行长时间运行或I/O绑定操作,您绝对必须开始利用WCF对异步服务操作的支持。现在,有很多方法可以做到这一点,但如果您使用的是.NET4.0,没有比使用任务并行库(TPL)更好的方法了。首先,通过将工作卸载到TPL线程,您可以释放WCFI/O线程来处理更多调用。这样,长时间运行的WCF操作不会限制WCF记录其他操作的能力。其次,TPL默认使用线程池。您不必担心每个操作都会激活它自己的线程并最终耗尽资源机器。TPL也足够聪明,可以比您自己更有效地将所有内核的工作分散到各个盒子中,而无需投入大量资金编写流水线代码。第三,TPL可以与传统的异步编程模型(APM)结合使用,因此,如果您正在使用类似Streams(网络或文件)的东西,您可以使用它们的BeginRead/Write方法来利用最大的异步I/哦。当读/写被阻塞时会释放CPU线程。即使您不使用TPL,您也绝对应该使用它以获得最高效率,TPL只是让它变得更容易。以下是如何使用TPL实现异步服务操作的“基本”示例:在这里执行异常长时间运行的操作...return42;},asyncState);//如果有回调,我们必须在处理完成后调用它if(callback!=null){processingTask.ContinueWith(_=>{callback(calculationTask);},TaskContinuationOptions.ExecuteSynchronously);}返回处理任务;}publicintEndSomeLongRunningOperation(IAsyncResultasyncResult){return((Task)asyncResult).Result;}Microsoft消息队列(MSMQ)怎么样?使用此体系结构,您可以将所有打印请求排队,然后使用Windows服务接收和处理这些请求。设置和支持分布式事务非常容易。MSDN上的MSMQ以上就是C#学习教程:UsingWebService避免线程并行(异步)任务分享的全部内容,如果对大家有用还需要详细了解C#学习教程,希望大家多多关注——本文来自网络收藏,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
