2013-03-11 27 views
5

Khi tôi tạo ra một nhiệm vụ nhưLàm cách nào để có được tham chiếu về chuỗi nhiệm vụ TPL trong C#?

Task task = Task.Factory.StartNew(() => someMethod(args)); 

trong C# 4.0 trở lên, làm thế nào tôi có thể nhận được các tài liệu tham khảo của các chủ đề (s) của nhiệm vụ này?

Có thể thực hiện tác vụ trong cùng một chuỗi đã tạo nhiệm vụ hoặc sinh ra nhiều hơn một chuỗi không?

Cập nhật:
Lý do là:

  • Tôi muốn xác định chủ đề của nhiệm vụ trong chương trình gỡ rối (và thuộc tính tên cho nó) vv

là nhiệm vụ tạo thực hiện luôn luôn trong chủ đề riêng biệt từ một trong đó một nhiệm vụ được tạo ra?
Có phải một, không hoặc nhiều hơn một luồng không?
Được thực thi trên một lõi đơn và cùng một lõi?
Điều quan trọng là phải biết từ đó, ví dụ, tôi có thể đưa vào giấc ngủ suy nghĩ chủ đề chính mà tôi đang đóng băng người lao động nền

Cập nhật:
câu trả lời hữu ích:

+5

Bạn không bao giờ cần làm điều đó. Bạn đang cố giải quyết vấn đề gì? – SLaks

+1

Theo như tôi biết, bạn không thể làm điều đó. Không có gì đảm bảo rằng nhiệm vụ sẽ sinh ra một luồng mới, nó có thể chạy trên cùng một luồng mà nó đã được tạo ra. Ngoài ra nhiệm vụ (có thể) có thể được phân chia giữa nhiều luồng. Nhưng tôi với @SLaks ở đây, có điều gì đó liên quan đến cách tiếp cận này nói chung. –

+0

Câu trả lời: (1) chắc chắn nhưng tại sao, (2) có, (3) có. – user7116

Trả lời

7

Tác vụ được tạo có được thực thi luôn trong chuỗi riêng biệt từ chuỗi trong đó tác vụ được tạo không?

Không, có một số trường hợp trong đó TPL có thể xác định rằng tác vụ có thể được thực hiện trên cùng một chủ đề đã tạo ra nó, hoặc vì tùy chọn tạo nhiệm vụ có liên quan (hoặc công cụ lên lịch) đã được cung cấp, hoặc như là một tối ưu hóa bởi vì các chủ đề gọi điện thoại nếu không sẽ không có bất cứ điều gì để làm. Bạn không thực sự cần phải lo lắng về điều này mặc dù; nó không giống như bạn sẽ kết thúc chặn thread UI vì TPL chọn để thực thi mã của nó trong ngữ cảnh đó. Điều đó sẽ không xảy ra trừ khi bạn đặc biệt chỉ ra rằng nó nên. Đối với tất cả ý định và mục đích bạn có thể giả định rằng điều này không bao giờ xảy ra (trừ khi bạn buộc nó xảy ra) nhưng đằng sau hậu trường, mà không cần bạn phải nhận ra nó, vâng, nó có thể xảy ra.

Có một, không hoặc nhiều hơn một luồng không?

Theo mặc định, các tác vụ được thực thi trong nhóm chủ đề. Các hồ bơi thread sẽ thay đổi về số lượng các chủ đề nó chứa dựa trên khối lượng công việc nó được đưa ra. Nó sẽ bắt đầu tại một, nhưng phát triển nếu có đủ nhu cầu, và thu nhỏ nếu điều đó cần biến mất. Nếu bạn chỉ định tùy chọn LongRunning, một chuỗi mới sẽ chỉ được tạo cho số Task. Nếu bạn chỉ định một tuỳ chỉnh TaskScheduler, bạn có thể có nó làm bất cứ điều gì bạn muốn nó.

Được thực thi trên một lõi và cùng một lõi?

Có khả năng, nhưng không chắc chắn.

Điều quan trọng là phải biết từ đó, ví dụ, tôi có thể đưa vào giấc ngủ suy nghĩ chủ đề chính mà tôi đang đóng băng người lao động nền

Đưa các chủ đề chính để ngủ sẽ không ngăn chặn nền công nhân làm việc. Đó là toàn bộ điểm của việc tạo ra các công nhân nền, hai nhiệm vụ không ngăn nhau làm công việc. Lưu ý rằng nếu nhân viên nền bao giờ cố gắng truy cập vào giao diện người dùng hoặc để báo cáo tiến độ hoặc kết quả hiển thị và giao diện người dùng bị chặn, thì họ sẽ đợi chuỗi giao diện người dùng được miễn phí tại thời điểm đó.

+1

+1, câu hỏi khác của OP về việc tìm kiếm Tác vụ trong trình gỡ rối tôi sẽ trỏ chúng đến ['Task.Id' /' Task.CurrentId'] (http://msdn.microsoft.com/en-us/library/ system.threading.tasks.task.id.aspx) (ghi chú MSDN có cho Debuggers) và cửa sổ [Parallel Tasks] (http://msdn.microsoft.com/en-us/library/dd998369.aspx). – user7116

3

Bạn có thể sử dụng:

System.Threading.Thread.CurrentThread 

Nhưng như đã nói trong các ý kiến, bạn sử dụng TPL để trừu tượng luồng đi, do đó, quay lại "mức thấp" này là một dấu hiệu có khả năng thiết kế kém.

3

Task.Factory.StartNew() xếp hàng nhiệm vụ để thực hiện (xem here). Chuỗi thực tế thực hiện nhiệm vụ và khi nó được thực hiện lên đến TaskScheduler được chỉ định (TaskScheduler hiện tại được sử dụng nếu không có quy tắc nào được chỉ định).

Trong .Net 4 TaskScheduler mặc định sử dụng ThreadPool để thực hiện các tác vụ (xem here) vì vậy nếu ThreadPool Thread xếp hàng nhiệm vụ cùng một luồng có thể thực thi nó sau này.

Số lượng chủ đề được chỉ định bởi ThreadPool.

Bạn không thực sự quan tâm đến việc thực thi các tác vụ cốt lõi của bạn.

Xếp hàng Nhiệm vụ để thực thi rất có thể sẽ lập lịch để thực hiện trên ThreadPool Thread, do đó bạn sẽ không có nguy cơ vô tình đặt chủ đề chính vào chế độ ngủ

+0

Trình lập lịch biểu tác vụ * mặc định * (sử dụng nhóm chủ đề) được sử dụng nếu không có chỉ định nào, không phải là công cụ lập lịch tác vụ hiện tại. – Servy

+1

Không theo tài liệu MSDN. Nó nói rằng gọi Factory.StartNew() tương đương với việc tạo một Task và gọi Task.Start() sử dụng dòng điện. Xem các liên kết trong bài đăng của tôi. – SpaceghostAli

Các vấn đề liên quan