请帮我理解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
}
}
做必要的事。如果可能的话,请给我一些有用的链接。 问候
答案 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);
}