我需要一种方法来按用户锁定c#线程。
我有我的数据对象,并为每个用户创建一个新实例。 每个用户都有几个线程使用此对象,在I.O操作中,我想仅为此用户锁定此对象实例。 使用简单的Lock{}会锁定所有对象实例,因此阻止其他用户。
我需要一些简单的解决方案。
编辑
我为每个用户构建MyDataObj
的新实例;
然后运行更新MyDataObj
中某些数据的作业,每分钟一次;
使用lockObj
作为锁,将数据锁定到所有用户(尽管它不是静态变量)
我只需要将数据锁定到当前用户
以下是代码示例
public sealed class MyDataObj
{
private static readonly Dictionary<object, MyDataObj> _instances = new Dictionary<object, MyDataObj>();
public object lockObj = new object();
public bool jobRunning = false;
private string data = string.Empty;
//// --------- constractor -------------------
private MyDataObj(int key)
{
LoadMyDataObj(key);
}
public static MyDataObj GetInstance(int key)
{
lock (_instances)
{
MyDataObj instance;
if (_instances.TryGetValue(key, out instance))
{
instance = _instances[key];
return instance;
}
instance = new MyDataObj(key);
return instance;
}
}
private void LoadMyDataObj(int key)
{
// get the data from db
}
public void UpdateMyData(string newData)
{
lock (lockObj)
{
this.data = newData;
}
}
public string ReadMyData()
{
lock (lockObj)
{
return this.data;
}
}
public class ActionObject
{
MyDataObj myDataObj;
int UserID;
//// --------- constractor -------------------
public ActionObject(int userid)
{
this.UserID = userid;
myDataObj = MyDataObj.GetInstance(userid);
if (!myDataObj.jobRunning)
{
jobs jbs = new jobs(myDataObj);
System.Threading.Thread RunJob = new System.Threading.Thread(new System.Threading.ThreadStart(jbs.dominutesAssignment));
RunJob.Start();
myDataObj.jobRunning = true;
}
}
public ActionObject()
{
myDataObj = MyDataObj.GetInstance(this.UserID);
myDataObj.UpdateMyData("some data");
}
}
public class jobs
{
MyDataObj myDataObj = null;
public jobs(MyDataObj grp)
{
this.myDataObj = grp;
}
public void dominutesAssignment()
{
while (true)
{
myDataObj.ReadMyData();
System.Threading.Thread.Sleep(1000);
}
}
}
}
MyDataObj
类包含一个静态字典,其中存储了MyDataObj
实例和访问它的方法,实例方法和属性只能在内部访问,还有一些嵌套类可以访问MyDataObj
方法。如果我的同事或员工要求我帮忙调试这个代码,我会建议他首先重构它。目前来看,很难弄清楚谁可以访问什么,以及所有不同部分之间的交互方式。 - Jim Mischel