我需要一种方法来锁定用户的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);
}
}
}
}
答案 0 :(得分:4)
我需要一种方法来锁定用户的c#线程。我有我的数据对象,我为每个用户创建新实例
为每个用户创建一个锁。或者,如果用户存在的时间长于线程:使用用户对象作为锁定。
lock (userOrTheUserObject)
{
//Do some op
}
每个用户都有几个使用此对象的线程,并且在I.O.运营
这听起来更像是你应该使用异步IO而不是创建多个线程(效率会降低)
我想仅为此用户锁定此对象实例。使用简单的Lock {}锁定所有对象实例,用于阻止其他用户。
如果所有用户共享该对象,则必须使用lock
锁定该对象。否则锁定不会很有效。另一个目标是重新设计现在要共享的对象。
我需要一些简单的解决方案。
没有简单的线程解决方案。
答案 1 :(得分:3)
您可以使用Monitor
。在此示例中,除用户1之外的任何人都可以同时执行DoIt方法。当用户1执行DoIt时,没有人可以输入它。缺点是如果用户1在用户2已经执行DoIt时尝试执行DoIt,则用户2继续执行。此外,您必须正确处理异常,否则可能会出现死锁。
private static readonly object lockObj = new Object();
public void Do(int userId)
{
Monitor.Enter(lockObj);
if (userId != 1)
Monitor.Exit(lockObj);
try
{
DoIt();
}
finally
{
if (userId == 1)
Monitor.Exit(lockObj);
}
}
public void DoIt()
{
// Do It
}