【问题标题】:Thread information logging线程信息记录
【发布时间】:2013-12-14 01:49:36
【问题描述】:

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

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

【问题讨论】:

  • 在发布之前删除过多的缩进(大多数文本编辑器可以制表符/取消制表符)是一件“不错”的事情。
  • 这就是为什么您使用日志框架而不是随便将内容写入文件的原因。
  • 你确定“文件的路径”是一些明确的字符串值,而不是像TextControl21.Text(或“写入文本文件..”部分)?
  • @KirkWoll - 虽然日志框架确实很有用,但它可能无法解决问题。我相信异常与此处显示的代码无关,而是与隐藏在 cmets 中的代码有关。在任何线程上创建作家都很好......
  • @Sharpeye500 所以只需在线程主体内使用 Thread.CurrentThread.ManagedThreadId,您不需要访问线程[]

标签: c# .net multithreading thread-safety


【解决方案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. 即使线程会在没有任何同步的情况下打开此文件,它们也可能是文件访问中的竞争条件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2023-04-03
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多