了解c#中的锁定

时间:2014-12-24 07:26:31

标签: c# multithreading locking

请帮我理解c#中的锁定流程。  带有方法的类会定期通过两个不同的线程连续调用。

class DataRetriever
{
   BaseUrl="...";
   public static void _Fetch(<list<dataInformation> quote)
   {
      XDocument doc=XDocument.Load(BaseUrl);
      parse(quote,doc);
   }

   private static void Parse(List<dataInformation> quotes, XDocument doc)
   {
       // some statement
   }
}

// dataInformation is a class here

现在问题是...... 1.如果两个或多个线程定期调用_Fetch()方法,是否需要lock语句。如果是,请告诉我为什么以及如何?我想了解锁流。 2.为什么我们使用对象锁定?

我在这里试过

class DataRetriever
{
   BaseUrl="...";

   object obj=new object()
   public static void _Fetch(<list<dataInformation> quote)
   {
      lock(obj) // giving error obj is not accepting here
      {
         XDocument doc=XDocument.Load(BaseUrl);
         parse(quote,doc);
      }
   }

   private static void Parse(List<dataInformation> quotes, XDocument doc)
   {
       // some statement
   }
}

也试图解决

class DataRetriever
{
   BaseUrl="...";

   public static void _Fetch(<list<dataInformation> quote)
   {
      lock(this) // giving error this is not accepting
      {
         XDocument doc=XDocument.Load(BaseUrl);
         parse(quote,doc);
      }
   }

   private static void Parse(List<dataInformation> quotes, XDocument doc)
   {
       // some statement
   }
}

做必要的事。如果可能的话,请给我一些有用的链接。 问候

2 个答案:

答案 0 :(得分:0)

这是正确的,但你应该注意防止编译的错误。

你的对象obj = new object();错过了;

class DataRetriever
{
   BaseUrl="...";

   object obj=new object();
   public void _Fetch(<list<dataInformation> quote)
   {
      lock(obj) // giving error obj is not accepting here
      {
         XDocument doc=XDocument.Load(BaseUrl);
         parse(quote,doc);
      }
   }

   private void Parse(List<dataInformation> quotes, XDocument doc)
   {
       // some statement
   }
}

如下所述,您还使用带有静态方法的实例字段。我只是将方法改为非静态。

答案 1 :(得分:0)

您收到错误是因为您尝试在{strong>静态方法中使用反映您类型的当前实例this你的类型,而不是你的实例。

非静态类上的静态方法将导致仅通过静态构造函数(如果存在)或通过字段初始化来初始化静态字段。这就是为什么在你的方法中不允许使用this的原因。

替代方法可以是为锁创建静态字段。请注意,这意味着此锁定对象将在您的类的所有实例之间共享。

public static object _lock = new object();

然后:

lock(_lock)
{
    XDocument doc=XDocument.Load(BaseUrl);
    parse(quote,doc);
}