C# c中这两个锁的区别#
我的WCF服务中有以下功能。此函数用于创建html页面。它使用windows窗体的WebBrowser控件创建它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
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的调用,以便没有两个线程可以同时访问它。我有以下方法:-
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();
}
}
请帮助我理解这两种方法之间的差异,这将有助于我实现所需的结果。如果在函数中定义锁对象,它将在每次进入函数时重新创建,因此根本无法工作--所有线程将同时进入函数。您需要在类级别为线程安全代码声明锁对象。所有这些都不起作用。您需要一个锁对象是静态的,因此在类的每个实例之间共享
private static object _locker = new Object();
无法在函数中创建静态变量,因此方法#2不适用。只有当函数位于单例中时,第一个函数才能工作
如果您想要一个正确的锁,这样它只能在整个机器上调用一次,那么您需要一个
互斥锁“请帮助我理解这两种方法的区别,这将有助于我实现所需的结果。”-您还没有说明您的目标……“定义私有对象锁=新对象()在GenerateWebSiteThumbnailImage函数中,使用与第1点相同的代码“-如何在函数中定义私有对象?如果创建类的多个实例,当该方法只运行一次时,无论哪个类调用实例持有它,您都需要一个静态类变量。实现单例而不是使用静态锁可能是有意义的。我同意,您可以节省实例化对象的时间。而且它使代码更具可读性。