gpt4 book ai didi

c# - 用户锁定线程

转载 作者:行者123 更新时间:2023-11-30 14:13:15 26 4
gpt4 key购买 nike

我需要一种方法来按用户锁定 c# 线程

我有我的数据对象,我为每个用户创建了新的实例。每个用户都有多个使用该对象的线程,并且在 I.O. operations 我只想为这个用户锁定这个对象实例。使用简单的 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);
}
}
}
}

最佳答案

I need a way to lock c# threads by user. I have my data object and I create new instance for every user

为每个用户创建一把锁。或者如果用户存在的时间长于线程:使用用户对象作为锁。

lock (userOrTheUserObject)
{
//Do some op
}

Every user has several threads that use this object and in I.O. operations

这听起来更像是你应该使用异步 IO 而不是创建多个线程(这会降低效率)

I want to lock this object instance for this user only. Using simple Lock {} is locking all the object instances, there for blocking other user.

如果对象在所有用户之间共享,您必须使用 lock 锁定它。否则锁不会很有效。另一个目标是重新设计现在共享的对象。

I need some simple solution.

没有简单的线程解决方案。

关于c# - 用户锁定线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14701089/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com