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
Trả lời
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 ..
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. –
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ó. –
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.
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);
}
}
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. –
.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
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.
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
- 1. Thời gian chờ cho BackgroundWorker
- 2. Hủy backgroundworker
- 3. BackgroundWorker RunWorkerCompletedEventArgs.Cancelled luôn sai
- 4. Cách sử dụng BackgroundWorker?
- 5. Backgroundworker hủy bỏ
- 6. C# Winform ProgressBar và BackgroundWorker
- 7. BackgroundWorker và WebBrowser Control
- 8. BackgroundWorker và ClipBoard
- 9. Phương thức gọi từ BackgroundWorker
- 10. Cách làm cho BackgroundWorker trả về một đối tượng
- 11. BackgroundWorker có phù hợp cho hoạt động lâu dài không?
- 12. BackgroundWorker vs background Chủ đề
- 13. Cách dừng BackgroundWorker chính xác
- 14. BackgroundWorker xử lý ngoại lệ
- 15. đặt tên chương trình cho typedefs
- 16. jQuery: Đặt cookie cho hai tên miền
- 17. Đặt tên cho bộ điều khiển gốc
- 18. Quy ước đặt tên cho Traits PHP?
- 19. Đặt tên cho ô có POI
- 20. Cách đặt đối số được đặt tên cho string.Format?
- 21. Vấn đề WPF/BackgroundWorker và BitmapSource
- 22. C# Biến tên đặt tên
- 23. BackgroundWorker Không hoạt động trong VSTO
- 24. BackgroundWorker với các phương thức ẩn danh?
- 25. Quy ước đặt tên: Đặt tên biến boolean là gì?
- 26. Đặt tên kiểu enum
- 27. Đặt tên Haskell Modules
- 28. Đặt tên webrole Azure
- 29. HTML: Quy ước đặt tên cho thuộc tính ID
- 30. Quy ước đặt tên cho các tệp lớp một phần
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'). –