2013-08-05 43 views
5

C# Task có chạy trên một lõi không?C# Task có chạy trên một lõi không?

Tôi có một dự án mà tôi cần quyết định số lượng Công việc cần tạo. Tôi cần phải tạo bao nhiêu, vì máy tính có thể thực hiện. Có phải số lượng bộ xử lý, lõi hoặc bộ vi xử lý hợp lý, tôi là nhầm lẫn giữa ba tùy chọn.

+0

Như tôi đã hiểu, một chuỗi được quản lý thậm chí không nhất thiết phải chạy trên chuỗi gốc riêng của nó. Vì vậy, tôi nghĩ câu trả lời cho câu hỏi của bạn là "không". – ken

+1

Một tác vụ hoạt động rất giống như một luồng mà lõi nó chạy trên (tôi tin). Để trả lời các câu hỏi của bạn, nó phụ thuộc vào những gì các nhiệm vụ của bạn đang làm mà tài nguyên là họ sử dụng nhiều nhất của CPU/IO/Memory/Disk ...? – TheKingDave

+0

Nhiệm vụ có thể nhảy từ lõi này sang lõi khác. Điều bạn nên thực sự hỏi là "một nhiệm vụ có chạy trên nhiều lõi không?". Số –

Trả lời

3

Nhiệm vụ thực hiện trên một chuỗi. Hệ điều hành sẽ lên lịch các luồng. Lõi là một khái niệm logic và khác với các chip CPU vật lý.

Tạo Environment.ProcessorCount tác vụ hoặc sử dụng tốt hơn một trong các cấu trúc TPL cấp cao hơn như PLINQ hoặc Parallel.

0

Nếu bạn sử dụng thư viện Công việc (PTL), bạn sẽ không cần phải lo lắng về điều này. Bạn có thể đọc thêm về nó here. Tóm lại:

TPL quy mô mức độ sử dụng đồng thời để sử dụng hiệu quả nhất tất cả các bộ xử lý có sẵn. Bên cạnh đó, TPL xử lý các phân vùng của công việc ...

Chúng tôi đã tạo một wrapper xung quanh công tác như sau:

public static class PeriodicTaskFactory 
{ 
    public static Task Start(Action action, int intervalInMilliseconds = -1, int delayInMilliseconds = 0, int duration = -1, int maxIterations = -1, bool synchronous = false, CancellationToken cancelToken = null, TaskCreationOptions periodicTaskCreationOptions = TaskCreationOptions.None); 
} 

Và sau đó chúng tôi gọi nó là như vậy. Trong trường hợp này, công việc duy nhất chúng tôi muốn thực hiện là gọi một phương thức duy nhất cứ sau 1 phút, với độ trễ 1 giây trong lần thực hiện đầu tiên.

 PeriodicTaskFactory.Start(() => 
     { 
      CdClMappingLogic.Invoke(); 
     }, 60000, 1000, -1, -1, true) 
+0

Bạn có thể cụ thể hơn không? Có, tôi đang đọc tài liệu đó. – user2381422

+0

Về cơ bản những gì ông đang tiết kiệm ở đây là bạn trong TPL bạn xác định công việc và để cho khuôn khổ làm việc ra bao nhiêu chủ đề ... vv để tạo ra. Bạn chỉ cần xác định những gì mỗi thread là để làm. – TheKingDave

+0

@ user2381422 - Có, như TheKingDave đã nói, nó rất đơn giản để sử dụng. Bạn xác định công việc bạn muốn thực hiện, bọc nó trong một nhiệm vụ và .NET FW quyết định cách tốt nhất để thực thi khối công việc đó dựa trên cpu và các tài nguyên khác. –

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