ユーザーがC#スレッドをロックする方法が必要です
データオブジェクトがあり、すべてのユーザーに対して新しいインスタンスを作成します。すべてのユーザーには、このオブジェクトを使用する複数のスレッドがあり、IO操作では、このユーザーに対してのみこのオブジェクトインスタンスをロックしたいと思います。単純なロック{}を使用すると、他のユーザーをブロックするために、すべてのオブジェクトインスタンスがロックされます。
簡単な解決策が必要です。
編集
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);
}
}
}
}