C# c中这两个锁的区别#

C# c中这两个锁的区别#,c#,multithreading,C#,Multithreading,我的WCF服务中有以下功能。此函数用于创建html页面。它使用windows窗体的WebBrowser控件创建它 public Bitmap Convert(string htmlContent, int faceSheetWidth, int faceSheetHeight) { tempFileName = Guid.NewGuid().ToString().Replace("-", ""); tempImageName = Guid.NewGuid

我的WCF服务中有以下功能。此函数用于创建html页面。它使用windows窗体的WebBrowser控件创建它

 public Bitmap Convert(string htmlContent, int faceSheetWidth, int faceSheetHeight)
    {
        tempFileName = Guid.NewGuid().ToString().Replace("-", "");
        tempImageName = Guid.NewGuid().ToString().Replace("-", "");            
        try
        {
            width = faceSheetWidth;
            height = faceSheetHeight;

            SaveHtmlContent(htmlContent);

            //Thread m_thread = new Thread(new ThreadStart(GenerateWebSiteThumbnailImage));                
            Thread m_thread = new Thread(() =>
            {
                try
                {
                    GenerateWebSiteThumbnailImage();
                }
                catch (Exception ex)
                {
                    LoggingHelper.LogException(ex, Source.EDiscFacilityService);
                    LoggingHelper.LogException(new Exception("FaceSheet can not be created."), Source.EDiscFacilityService);
                }
            });        
            m_thread.SetApartmentState(ApartmentState.STA);
            m_thread.Start();
            m_thread.Join();
      }


 void GenerateWebSiteThumbnailImage()
    {
        WebBrowser m_WebBrowser = null;
        try
        {
            m_WebBrowser = new WebBrowser();
            m_WebBrowser.ScrollBarsEnabled = false;
            m_WebBrowser.Navigate(tempLocation);
            m_WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(m_WebBrowser_DocumentCompleted);
            while (m_WebBrowser.ReadyState != WebBrowserReadyState.Complete)
                Application.DoEvents();
        }
        catch {
        }
        finally
        {
            if(m_WebBrowser != null)
                m_WebBrowser.Dispose();
        }
    }


 void m_WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        WebBrowser m_WebBrowser = null;
        try
        {
            m_WebBrowser = (WebBrowser)sender;
            m_WebBrowser.ClientSize = new Size(this.width, this.height);
            m_WebBrowser.ScrollBarsEnabled = false;
            m_WebBrowser.Width = this.width;
            m_WebBrowser.Height = this.height;
            m_Bitmap = new Bitmap(m_WebBrowser.Bounds.Width, m_WebBrowser.Bounds.Height);
            m_WebBrowser.BringToFront();
            m_WebBrowser.DrawToBitmap(m_Bitmap, m_WebBrowser.Bounds);
            m_Bitmap = (Bitmap)m_Bitmap.GetThumbnailImage(width, height, null, IntPtr.Zero);
        }
        catch { }
    }
我必须锁定对GenerateWebSiteThumbnailImage的调用,以便没有两个线程可以同时访问它。我有以下方法:-


  • 在类级别定义private object locker=new object(),并按如下方式更改方法:-

    void GenerateWebSiteThumbnailImage()
    {            
        WebBrowser m_WebBrowser = null;
        try
        {
            lock (locker)
            {
                m_WebBrowser = new WebBrowser();
                m_WebBrowser.ScrollBarsEnabled = false;
                m_WebBrowser.Navigate(tempLocation);
                m_WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(m_WebBrowser_DocumentCompleted);
                while (m_WebBrowser.ReadyState != WebBrowserReadyState.Complete)
                    Application.DoEvents();
            }
        }
        catch {
        }
        finally
        {
            if(m_WebBrowser != null)
                m_WebBrowser.Dispose();
        }
    }
    

  • 在GenerateWebSiteThumbnailImage函数内定义private object locker=new object(),并使用与第1点相同的代码


  • 请帮助我理解这两种方法之间的差异,这将有助于我实现所需的结果。

    如果在函数中定义锁对象,它将在每次进入函数时重新创建,因此根本无法工作--所有线程将同时进入函数。您需要在类级别为线程安全代码声明锁对象。

    所有这些都不起作用。您需要一个锁对象是静态的,因此在类的每个实例之间共享

    private static object _locker = new Object();
    
    无法在函数中创建静态变量,因此方法#2不适用。只有当函数位于单例中时,第一个函数才能工作


    如果您想要一个正确的锁,这样它只能在整个机器上调用一次,那么您需要一个
    互斥锁

    “请帮助我理解这两种方法的区别,这将有助于我实现所需的结果。”-您还没有说明您的目标……“定义私有对象锁=新对象()在GenerateWebSiteThumbnailImage函数中,使用与第1点相同的代码“-如何在函数中定义私有对象?如果创建类的多个实例,当该方法只运行一次时,无论哪个类调用实例持有它,您都需要一个静态类变量。实现单例而不是使用静态锁可能是有意义的。我同意,您可以节省实例化对象的时间。而且它使代码更具可读性。