2010-07-16 2 views
21

Я хотел бы иметь возможность назвать BackgroundWorker, чтобы упростить его отладку. Это возможно?Именование BackgroundWorker

+3

Как отметил Джонатан в комментарии к принятому ответу, это представляет собой * реальный риск возникновения путаницы, поместив имя в поток, который позже повторно используется для чего-то другого. Это не ваша нить; не пытайтесь назвать его. Если вам нужен именованный поток, создайте свой собственный (а не используйте «BackgroundWorker»). –

ответ

29

Мне нужно попробовать, но не можете ли вы просто установить Name потока в методе DoWork(), выполняемом BackgroundWorker?

UPDATE: Я просто попытался следующую строку кода в качестве первого утверждения метода DoWork() мои BackgroundWorkers и она работает:

if (Thread.CurrentThread.Name == null) 
    Thread.CurrentThread.Name = "MyBackgroundWorkerThread"; 

UPDATE: Как Джонатан Аллен правильно указано имя нить написать один раз, поэтому я добавил нулевую проверку перед установкой имени. Попытка записать имя во второй раз приведет к исключению InvalidOperationException. Как Марк Gravell писал он может также сделать отладку сложнее как только объединенные фоновые потоки повторно используются для другой работы, поэтому название темы только при необходимости ..

+4

Я думаю, что это опасно. Вы можете установить имя только один раз, но потоки, которые используют фоновые рабочие, могут быть повторно использованы. –

+2

Я согласен с @Jonathan - если это не ваш поток, вы не должны его именовать. –

0

Вы можете назвать свои темы в «Нити» -window при отладке в Visual Studio.

13
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); 
    } 
} 
+0

Я только что проверил с рефлектором. BackgroundWorker.RunWorkerAsync использует потоки потоков. Поскольку имя потока можно установить только один раз, ваш код генерирует исключение, если вы дважды используете тот же поток threadpool. –

+0

.NET 4.0 использует встроенный тип «private delegate void WorkerThreadStartDelegate (аргумент объекта)»; И они называют на него BeginInvoke, так как, насколько я вижу, они не используют ThreadPool, но вы правы, я должен был проверить, было ли Имя пустым, прежде чем устанавливать его. – XIU

1

Вы можете продлить фоновый рабочий через пользовательский класс:

`

public class NamedBackgroundWorker : BackgroundWorker 
{ 

    public string Name; 

    public BackgroundWorker(string Name) 
    { 
     this.Name = Name; 
    } 
} 

` Теперь просто создать объект из этого, и вы можете назвать его и использовать его в качестве фона работник.

+1

Этот ответ такой же, как и более ранний ответ XIU, но с небольшим чуть-чуть лучшим объяснением – Jmons