我正在尝试将这些线程信息写入日志中 - 如线程编号/名称,开始日期时间等。
Thread[] threads = new Thread[10];
for (int i = 0; i < 10; i++)
{
threads[i] = new Thread(() =>
{
System.Threading.Thread.Sleep(4000);
ActualMethod(); //Goes here...
using (TextWriter tw = new StreamWriter("path of the file", true))
{
//Write to a text file...
}
});
threads[i].Start();
}
for (int i = 0; i < 10; i++)
{
threads[i].Join();
}
如果我尝试添加代码来写入线程代码内的文件(即在ActualMethod()之后的行,我得到跨线程异常 - 无法在线程外访问变量。
答案 0 :(得分:1)
代码中的日志文件是在没有任何同步的情况下使用的共享资源。因此,如果要对所有线程使用相同的文件,则至少存在两个问题:
使用代码:
using (TextWriter tw = new StreamWriter(@"C:\Projects\StackOverflow\log.txt", true))
您正在打开文件,因为StreamWriter
实施通过FileAccess.Write
访问和FileShare.Read
共享模式打开此文件:
new FileStream(path, mode, FileAccess.Write, FileShare.Read, 4096, FileOptions.SequentialScan, Path.GetFileName(path), false, false, checkHost);
其他线程(每个线程在第一个线程之后)无法再以相同模式打开它。
即使线程打开此文件而没有任何同步,它们也可能是文件访问中的竞争条件。