【问题标题】:Is Debug.WriteLine() thread safe?Debug.WriteLine() 线程安全吗?
【发布时间】:2011-08-05 16:43:23
【问题描述】:

Debug.WriteLine() 线程安全吗?

根据this,它是线程安全的。但是,在我的多线程程序中,我得到了一些奇怪的输出。

例如:

代码

// these statements are found throughout the program
Debug.WriteLine("Polled database. {0} batch items retrieved.", items.Count());
Debug.WriteLine("Queued batch item: {0}", bm.BatchName);
Debug.WriteLine("Discarded batch item: {0} already queued.", bm.BatchName);
Debug.WriteLine("Creating task for batch item: {0}", bm.BatchName);
Debug.WriteLine("Removed batch item from processing items collection: {0}", bm.BatchName);
Debug.WriteLine("Could not remove batch item from processing items collection: {0}", bm.BatchName);
Debug.WriteLine("Begin Processing: {0}", bm.BatchName);
Debug.WriteLine("End Processing: {0}", bm.BatchName);

输出

"Polled database. 0 batch items retrieved."
"Polled database. 0 batch items retrieved."
"Polled database. 0 batch items retrieved."
"Polled database. 0 batch items retrieved."
"Polled database. 1 batch items retrieved."
"ronnie's batch: Queued batch item: {0}"
"ronnie's batch: Creating task for batch item: {0}"
"Begin Processing: ronnie's batch"
"Polled database. 1 batch items retrieved."
"ronnie's batch: Discarded batch item: {0} already queued."
"End Processing: ronnie's batch"
"ronnie's batch: Removed batch item from processing items collection: {0}"
"Polled database. 0 batch items retrieved."

您可以看到ronnie's batch: Queued batch item: {0} 开始偏离轨道如果我首先使用 string.Format(),我没有问题。怎么回事?

【问题讨论】:

    标签: .net multithreading thread-safety


    【解决方案1】:

    问题是你没有调用你认为的重载。您正在调用 Debug.WriteLine(string, string),它使用第一个参数作为消息,第二个参数作为 类别,而不是格式参数。

    解决此问题的最简单方法是将参数转换为 object 以强制它使用 Debug.WriteLine(string, params object[]) 重载:

    Debug.WriteLine("Queued batch item: {0}", (object) bm.BatchName);
    

    一种稍微冗长但可能更多对象的方法是显式创建数组:

    Debug.WriteLine("Queued batch item: {0}", new object[] { bm.BatchName });
    

    或者(只是为了继续提供选项 :) 显式调用 string.Format 以调用 Debug.WriteLine(string) 重载:

    Debug.WriteLine(string.Format("Queued batch item: {0}", bm.BatchName));
    

    或者当你只是在末尾直接包含参数:

    Debug.WriteLine("Queued batch item: " + bm.BatchName);
    

    或者,您可能想要创建自己的便捷方法,没有有额外的、无用的(在您的情况下)重载。

    【讨论】:

    • 谢谢,乔恩。我应该在重载中循环!
    • 现在,这就是我所说的答案!
    • 最后一个选项有效吗?我认为您想从文字中删除 {0}
    • @dlev:糟糕。这就是匆忙的问题...感谢罗尼的编辑。
    【解决方案2】:

    我知道这是一个旧线程,它与问题不是超级相关,但对于较新版本的 .NET,您也可以使用插值:

    Debug.WriteLine($"Queued batch item: {bm.BatchName}");
    

    此外,如果您最终来到这里,是的,它是线程安全的。这不是,我很难找到:

    Console.WriteLine($"Queued batch item: {bm.BatchName}");
    

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2011-07-04
      • 2014-04-26
      • 2012-11-30
      • 2010-12-30
      • 2013-03-12
      • 2021-08-03
      • 2010-12-27
      • 2018-06-04
      相关资源
      最近更新 更多