Я хотел бы иметь возможность назвать BackgroundWorker, чтобы упростить его отладку. Это возможно?Именование BackgroundWorker
ответ
Мне нужно попробовать, но не можете ли вы просто установить Name потока в методе DoWork(), выполняемом BackgroundWorker?
UPDATE: Я просто попытался следующую строку кода в качестве первого утверждения метода DoWork() мои BackgroundWorkers и она работает:
if (Thread.CurrentThread.Name == null)
Thread.CurrentThread.Name = "MyBackgroundWorkerThread";
UPDATE: Как Джонатан Аллен правильно указано имя нить написать один раз, поэтому я добавил нулевую проверку перед установкой имени. Попытка записать имя во второй раз приведет к исключению InvalidOperationException. Как Марк Gravell писал он может также сделать отладку сложнее как только объединенные фоновые потоки повторно используются для другой работы, поэтому название темы только при необходимости ..
Я думаю, что это опасно. Вы можете установить имя только один раз, но потоки, которые используют фоновые рабочие, могут быть повторно использованы. –
Я согласен с @Jonathan - если это не ваш поток, вы не должны его именовать. –
Вы можете назвать свои темы в «Нити» -window при отладке в Visual Studio.
public class NamedBackgroundWorker : BackgroundWorker
{
public NamedBackgroundWorker(string name)
{
Name = name;
}
public string Name { get; private set; }
protected override void OnDoWork(DoWorkEventArgs e)
{
if (Thread.CurrentThread.Name == null) // Can only set it once
Thread.CurrentThread.Name = Name;
base.OnDoWork(e);
}
}
Я только что проверил с рефлектором. BackgroundWorker.RunWorkerAsync использует потоки потоков. Поскольку имя потока можно установить только один раз, ваш код генерирует исключение, если вы дважды используете тот же поток threadpool. –
.NET 4.0 использует встроенный тип «private delegate void WorkerThreadStartDelegate (аргумент объекта)»; И они называют на него BeginInvoke, так как, насколько я вижу, они не используют ThreadPool, но вы правы, я должен был проверить, было ли Имя пустым, прежде чем устанавливать его. – XIU
Вы можете продлить фоновый рабочий через пользовательский класс:
`
public class NamedBackgroundWorker : BackgroundWorker
{
public string Name;
public BackgroundWorker(string Name)
{
this.Name = Name;
}
}
` Теперь просто создать объект из этого, и вы можете назвать его и использовать его в качестве фона работник.
Этот ответ такой же, как и более ранний ответ XIU, но с небольшим чуть-чуть лучшим объяснением – Jmons
- 1. BackGroundWorker
- 2. BackgroundWorker
- 3. BackgroundWorker: передать общий список BackgroundWorker
- 4. WFP BackgroundWorker ждет другого BackgroundWorker, чтобы закончить
- 5. Именование шаблона
- 6. Именование шаблона
- 7. Именование булевых
- 8. Именование последовательностей
- 9. Именование иконок
- 10. Именование подпроцессов
- 11. Отменить backgroundworker
- 12. Backgroundworker abort
- 13. inline backgroundworker
- 14. BackgroundWorker C#
- 15. Multi-BackgroundWorker
- 16. Отладка Backgroundworker
- 17. Powershell Backgroundworker
- 18. BackgroundWorker ошибочна
- 19. BackgroundWorker + WebBrowser
- 20. BackgroundWorker аннулирование
- 21. BackgroundWorker slow
- 22. BackgroundWorker, Methods
- 23. Именование поля для флажка
- 24. «Безопасный» Именование файлов
- 25. «var» именование переменных
- 26. Именование класса входных данных
- 27. Springfox @RestController Именование
- 28. Именование номера столбца SQL
- 29. Именование Android типы MIME
- 30. Android Виджеты Именование Стандарты
Как отметил Джонатан в комментарии к принятому ответу, это представляет собой * реальный риск возникновения путаницы, поместив имя в поток, который позже повторно используется для чего-то другого. Это не ваша нить; не пытайтесь назвать его. Если вам нужен именованный поток, создайте свой собственный (а не используйте «BackgroundWorker»). –