Является ли Debug.WriteLine () потокобезопасным? - PullRequest
6 голосов
/ 05 августа 2011

Является ли 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 (), у меня нет проблемы.Что происходит?

Ответы [ 2 ]

11 голосов
/ 05 августа 2011

Проблема в том, что вы не вызываете перегрузку, как вы думаете.Вы звоните 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);

В качестве альтернативы, вы можете создать свой собственный удобный метод, который не делает 't имеет дополнительную, бесполезную (в вашем случае) перегрузку.

0 голосов
/ 13 апреля 2019

Я знаю, что это старый поток, и он не очень важен для вопроса, но с более новыми версиями .NET вы также можете использовать интерполяцию:

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

Также, если вы окажетесь здесь, да, это потокобезопасно. Это не то, что я выяснил трудным путем:

Console.WriteLine($"Queued batch item: {bm.BatchName}");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...