繁体   English   中英

WCF webservice - 使用锁定会导致问题吗?

[英]WCF webservice - is using lock going to cause problems?

我们有一个WCF Web服务操作,用于生成PDF文件。 我们正在使用第三方工具(Syncfusion),我们目前可能无法取代它。

问题是,第三方工具似乎存在多线程问题,并且在某些情况下,当同时多次调用Web服务时,它不起作用。

我们可以通过使用lock并确保只有一个线程执行临界区来解决问题:

Public Class GeneratorController
{
    // object we use for lock
    private static Object thisLock = new Object();

    public void Generate(ref PdfDocument pdfDocument)
    {
        lock (thisLock)
        {
             // critical section
        }
    }
}

我的问题是:这是一个好主意吗? 如果我们在Web服务中有这样的代码会导致任何问题吗?

注意

这不是关于Syncfusion的问题。 这是一个关于在Web服务中使用lock的问题。 请不要将标签更改为syncfusion。

我在这里看到的问题是资源匮乏。

围绕锁没有FIFO规则。 因此,如果持续加载,您可以得到以下情况:

  • 线程A声称锁定
  • 线程B等待锁定
  • 线程C等待锁定
  • 线程A释放锁。 锁被任意地给予线程C
  • 线程D等待锁定。 现在你有线程BD都在等待。
  • 线程C释放锁。 即使通过线程B等待时间最长,也可以任意给予线程D锁定。

所以它一直持续到WCF调用超时,并且你得到一个不可能重现的错误。

如果我必须实现这一点,我将有一个专门用于生成PDF文件的工作线程。 该服务首次启动时将启动该线程,并等待从作业队列中取出作业。 每个WCF查询都会在此队列上发出请求,并且在它知道已处理作业之前,它会有一些阻止的方式。

.NET 4.0提供了BlockingCollection类来帮助解决这个问题。 (见这个问题

这为您提供了没有完整解决方案的方法,因为它不是一个小问题。 祝好运!

WCF支持同步调用服务对象,具体取决于您的需要,您可能需要查看以下两个属性:

如果你不能启动第三方组件的多个实例,并且该组件不允许并发访问(最坏的情况),那么你可以指定InstanceContextMode = Single,和ConcurrencyMode = Single; 在这种情况下,WCF将仅实例化WCF对象的单个副本(我假设它是第三方组件的包装),并且一次只处理一个请求。 请求将排队并以FIFO方式处理。 您不必在wcf服务中使用锁,因为WCF运行时确保您具有对wcf对象的同步访问权限。

Essential PDF是一个线程安全的组件,因此可以在多线程状态下创建PDF文档。 您能否请创建Direct-trac事件以获得解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM