2010-07-16 39 views
21

Tôi muốn có thể đặt tên cho một BackgroundWorker để dễ dàng gỡ lỗi hơn. Điều này có thể không?Đặt tên cho BackgroundWorker

+3

Như Jonathan đã lưu ý trong nhận xét về câu trả lời được chấp nhận, điều này thể hiện nguy cơ * thực sự gây nhầm lẫn, bằng cách đặt tên trên một chuỗi mà sau này được sử dụng lại cho một thứ khác. Nó không phải là chủ đề của bạn; không cố gắng đặt tên cho nó. Nếu bạn muốn có một chủ đề được đặt tên, hãy tạo chủ đề của riêng bạn (thay vì sử dụng 'BackgroundWorker'). –

Trả lời

29

Tôi phải thử nhưng không thể bạn chỉ cần đặt Name của chuỗi trong phương thức DoWork() được thực hiện bởi BackgroundWorker?

UPDATE: Tôi chỉ cố gắng dòng mã sau đây là tuyên bố đầu tiên của DoWork() phương pháp BackgroundWorkers của tôi và nó hoạt động:

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

UPDATE: Như Jonathan Allen tuyên bố một cách chính xác tên của một thread là viết một lần, vì vậy tôi đã thêm một kiểm tra null trước khi thiết lập tên. Một nỗ lực để viết tên cho lần thứ hai sẽ dẫn đến một InvalidOperationException. Như Marc Gravell đã viết nó cũng có thể làm cho việc gỡ lỗi khó khăn hơn ngay sau khi các chủ đề nền gộp lại được sử dụng lại cho các công việc khác, do đó, chỉ đặt tên cho chủ đề nếu cần ..

+4

Tôi nghĩ điều đó rất nguy hiểm. Bạn chỉ có thể đặt tên trên chuỗi một lần, nhưng các chủ đề mà nhân viên nền sử dụng có thể được sử dụng lại. –

+2

Tôi đồng ý với @ Jonathan - nếu đó không phải là chủ đề của bạn, bạn không nên đặt tên cho nó. –

0

Bạn có thể đặt tên cho chủ đề của mình trong "Chủ đề" khi bạn đang gỡ lỗi trong 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

Tôi vừa kiểm tra với Reflector. BackgroundWorker.RunWorkerAsync sử dụng các luồng thread-pool. Vì chỉ có thể đặt tên của chuỗi một lần, mã của bạn sẽ ném một ngoại lệ nếu bạn sử dụng cùng một chuỗi threadpool hai lần. –

+0

.NET 4.0 sử dụng kiểu lồng nhau "private delegate void WorkerThreadStartDelegate (đối số đối tượng);" Và họ gọi BeginInvoke trên nó, vì vậy như xa như tôi có thể thấy họ không sử dụng ThreadPool, nhưng bạn là chính xác, tôi nên đã kiểm tra nếu Tên là null trước khi thiết lập nó. – XIU

1

Bạn có thể kéo dài tuổi lao động nền thông qua một lớp tùy chỉnh:

'

public class NamedBackgroundWorker : BackgroundWorker 
{ 

    public string Name; 

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

' Bây giờ chỉ cần tạo một đối tượng từ này và bạn có thể đặt tên nó và sử dụng nó như là một nền tảng công nhân.

+1

Câu trả lời này giống như câu trả lời trước của XIU, nhưng với một chút giải thích tốt hơn – Jmons