用户锁定线程

时间:2013-02-05 05:59:30

标签: c# locking

我需要一种方法来锁定用户的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);
            }
        }
    }
}

2 个答案:

答案 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
}