线程信息记录

时间:2013-12-14 01:49:36

标签: c# .net multithreading thread-safety

我正在尝试将这些线程信息写入日志中 - 如线程编号/名称,开始日期时间等。

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()之后的行,我得到跨线程异常 - 无法在线程外访问变量。

1 个答案:

答案 0 :(得分:1)

代码中的日志文件是在没有任何同步的情况下使用的共享资源。因此,如果要对所有线程使用相同的文件,则至少存在两个问题:

  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);
    

    其他线程(每个线程在第一个线程之后)无法再以相同模式打开它。

  2. 即使线程打开此文件而没有任何同步,它们也可能是文件访问中的竞争条件。