Ron*_*rby 6 .net multithreading thread-safety
Debug.WriteLine()线程安全吗?
根据这个,它是线程安全的.但是,在我的多线程程序中,我得到一些奇怪的输出.
例如:
// 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);
Run Code Online (Sandbox Code Playgroud)
"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."
Run Code Online (Sandbox Code Playgroud)
你可以看到事情开始走下轨道ronnie's batch: Queued batch item: {0}如果我首先使用string.Format(),我没有问题.到底是怎么回事?
Jon*_*eet 11
问题是你没有调用你认为的过载.您正在调用Debug.WriteLine(string, string)哪个使用第一个参数作为消息,第二个参数作为类别,而不是格式参数.
解决这个问题的最简单方法是object强制转换你的参数以强制它使用Debug.WriteLine(string, params object[])重载:
Debug.WriteLine("Queued batch item: {0}", (object) bm.BatchName);
Run Code Online (Sandbox Code Playgroud)
稍微冗长的方法,但可能更多的对象,是显式创建数组:
Debug.WriteLine("Queued batch item: {0}", new object[] { bm.BatchName });
Run Code Online (Sandbox Code Playgroud)
或者(只是为了保持供应选项:) string.Format显式调用以调用Debug.WriteLine(string)重载:
Debug.WriteLine(string.Format("Queued batch item: {0}", bm.BatchName));
Run Code Online (Sandbox Code Playgroud)
或者当你只是包括直接在最后的说法:
Debug.WriteLine("Queued batch item: " + bm.BatchName);
Run Code Online (Sandbox Code Playgroud)
或者,您可能希望创建自己的便捷方法,该方法没有额外的,无用的(在您的情况下)重载.
| 归档时间: |
|
| 查看次数: |
1808 次 |
| 最近记录: |