C# 使用公共静态对象锁定线程共享资源 让我们考虑这个例子,我有两个类:
C# 使用公共静态对象锁定线程共享资源 让我们考虑这个例子,我有两个类:,c#,C#,主读卡器——从文件读取 public class Main_Reader { public static object tloc=new object(); public void Readfile(object mydocpath1) { lock (tloc) { string mydocpath = (string)mydocpath1; StringBuilder sb = new StringB
主读卡器
——从文件读取
public class Main_Reader
{
public static object tloc=new object();
public void Readfile(object mydocpath1)
{
lock (tloc)
{
string mydocpath = (string)mydocpath1;
StringBuilder sb = new StringBuilder();
using (StreamReader sr = new StreamReader(mydocpath))
{
String line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
sb.AppendLine(line);
}
}
string allines = sb.ToString();
}
}
}
MainWriter
——写入文件
public class MainWriter
{
public void Writefile(object mydocpath1)
{
lock (Main_Reader.tloc)
{
string mydocpath = (string)mydocpath1;
// Compose a string that consists of three lines.
string lines = "First line.\r\nSecond line.\r\nThird line.";
// Write the string to a file.
System.IO.StreamWriter file = new System.IO.StreamWriter(mydocpath);
file.WriteLine(lines);
file.Close();
Thread.Sleep(10000);
MessageBox.Show("Done----- " + Thread.CurrentThread.ManagedThreadId.ToString());
}
}
}
主要是用两个线程设置了两个函数
public string mydocpath = "E:\\testlist.txt"; //Here mydocpath is shared resorces
MainWriter mwr=new MainWriter();
Writefile wrt=new Writefile();
private void button1_Click(object sender, EventArgs e)
{
Thread t2 = new Thread(new ParameterizedThreadStart(wrt.Writefile));
t2.Start(mydocpath);
Thread t1 = new Thread(new ParameterizedThreadStart(mrw.Readfile));
t1.Start(mydocpath);
MessageBox.Show("Read kick off----------");
}
为了保证线程安全,我使用了一个公共静态字段
public static object tloc=new object(); //in class Main_Reader
我的问题是,这是一个好方法吗
因为我在一个MSDN论坛上读到:
避免锁定公共类型
是否有其他方法可以使此线程安全?如果您与其他人共享代码,我相信MSDN语句具有意义。你永远不知道他们是否会正确使用锁,然后你的线程可能会被阻塞。 解决方案可能是将两个线程体写入同一个类
另一方面,因为您处理的是文件,所以文件系统有自己的锁定机制。您将不允许写入正在读取的文件,或读取正在写入的文件。在这样的情况下,我会在同一个线程中执行读写操作。如果您仅通过类本身锁定要锁定的对象,为什么要将其公开?@Servy:因为他有两个线程classes@SLaks啊,没看到他们是不同的班级。那么新的问题是,为什么它们在不同的类中,而不是在一个类中?为什么不标记tlock内部?我想这两个类将在同一个集合中,对吗?所以你知道这不是一个好方法,大概已经用于类似的问题了,比如。。。请澄清您在这个问题上寻求的帮助是什么?文件系统锁定取决于文件打开时请求的内容。可以从正在安全写入的文件中读取(例如,如果写入始终是一个追加),因此通常通过代码打开文件来请求读取。如果代码要写入文件的各个区域,通常的做法是以独占模式打开文件,以防止在写入文件内容时读取文件。