2013-07-26 29 views
5

Xin gợi ý cho phương pháp nào là phù hợp (nếu có) cho chính xác và sử dụng hiệu quả ParallelOptions, TaskCreationOptions và Task.Factory.StartNew (() =>.Sử dụng đúng ParallelOptions, TaskCreationOptions và Task.Factory.StartNew?

private void NeedToUse_MaxDegreeOfParallelism_Method1() 
{ 
    CancellationTokenSource tokenFor_task = new CancellationTokenSource(); 

    ParallelOptions parOpts = new ParallelOptions(); 
    //parOpts.CancellationToken = tokenFor_task_tpl_Pair01.Token; 
    parOpts.MaxDegreeOfParallelism = Environment.ProcessorCount; 
    //parOpts.TaskScheduler = TaskScheduler.Default; 

    TaskCreationOptions tco = new TaskCreationOptions(); 
    tco = TaskCreationOptions.PreferFairness; 

    Task task = null; 
    task = Task.Factory.StartNew(() => 
    { 
     while (!tokenFor_task.IsCancellationRequested) 
     { 
      LongRunningMethod(); 
     } 
    }, tokenFor_task.Token, tco, TaskScheduler.Default); 
} 


private void NeedToUse_MaxDegreeOfParallelism_Method2() 
{ 
    //CancellationTokenSource tokenFor_task = new CancellationTokenSource(); 

    ParallelOptions parOpts = new ParallelOptions(); 
    parOpts.CancellationToken = tokenFor_task_tpl_Pair01.Token; 
    parOpts.MaxDegreeOfParallelism = Environment.ProcessorCount; 
    parOpts.TaskScheduler = TaskScheduler.Default; 

    TaskCreationOptions tco = new TaskCreationOptions(); 
    tco = TaskCreationOptions.PreferFairness; 

    Task task = null; 
    task = Task.Factory.StartNew(() => 
    { 
     while (!parOpts.CancellationToken.IsCancellationRequested) 
     { 
      LongRunningMethod(); 
     } 
    }, parOpts.CancellationToken, tco, parOpts.TaskScheduler); 
} 

private void NeedToUse_MaxDegreeOfParallelism_Method3() 
{ 
    CancellationTokenSource tokenFor_task = new CancellationTokenSource(); 

    ParallelOptions parOpts = new ParallelOptions(); 
    //parOpts.CancellationToken = tokenFor_task_tpl_Pair01.Token; 
    parOpts.MaxDegreeOfParallelism = Environment.ProcessorCount; 
    //parOpts.TaskScheduler = TaskScheduler.Default; 

    TaskCreationOptions tco = new TaskCreationOptions(); 
    tco = TaskCreationOptions.PreferFairness; 

    Task task = null; 
    task = Task.Factory.StartNew(() => 
    { 
     Parallel.Invoke(parOpts,() => 
     //while is already in LongRunningMethod() because can not be here 
     //while (!tokenFor_task.IsCancellationRequested) 
     //{ 
      LongRunningMethod() 
     //} 
     ); 
    }, tokenFor_task.Token, tco, TaskScheduler.Default); 
} 

private void NeedToUse_MaxDegreeOfParallelism_Method4() 
{ 
    CancellationTokenSource tokenFor_task = new CancellationTokenSource(); 

    ParallelOptions parOpts = new ParallelOptions(); 
    //parOpts.CancellationToken = tokenFor_task_tpl_Pair01.Token; 
    parOpts.MaxDegreeOfParallelism = Environment.ProcessorCount; 
    //parOpts.TaskScheduler = TaskScheduler.Default; 

    TaskCreationOptions tco = new TaskCreationOptions(); 
    tco = TaskCreationOptions.PreferFairness; 

    Task task = null; 
    Parallel.Invoke(parOpts,() => 
     task = Task.Factory.StartNew(() => 
     { 
      while (!tokenFor_task.IsCancellationRequested) 
      { 
       LongRunningMethod(); 
      } 
     }, tokenFor_task.Token, tco, TaskScheduler.Default) 
    ); 
} 

Hiện nay tôi không nhận được bất kỳ lỗi nào Đầu tiên và thứ hai phương pháp không đưa vào tài khoản MaxDegreeOfParallelism mà tôi cần phải sử dụng Lý tưởng nhất tôi sẽ không sử dụng Parallel.Invoke nhưng làm thế nào để bao gồm parOpts.MaxDegreeOfParallelism trong Task.Factory.StartNew?

Trả lời

7

Mã và câu hỏi của bạn không có ý nghĩa nhiều: Task.Factory.StartNew() không chấp nhận MaxDegreeOfParallelism, bởi vì nó thực hiện một hành động đơn lẻ. Parallel.Invoke() không chấp nhận tham số đó, nhưng nó không có ý nghĩa gì khi sử dụng phương thức đó khi bạn có một hành động. Thay vì hỏi một câu hỏi rất cụ thể như thế này, tôi nghĩ bạn nên lùi lại, nhìn vào những gì bạn đang thực sự cố gắng đạt được và sau đó có thể hỏi một câu hỏi mới về điều đó.

EDIT: Bây giờ tôi nghĩ cuối cùng tôi đã hiểu những gì bạn đang cố gắng làm: trên mỗi lõi, bạn muốn thực hiện một vòng lặp riêng biệt. Để làm điều đó, bạn có thể sử dụng ví dụ Parallel.For():

Parallel.For(0, Environment.ProcessorCount, parOpts,() => 
    { 
     while (!tokenFor_task.IsCancellationRequested) 
     { 
      LongRunningMethod(); 
     } 
    }); 
+0

Tôi cần LongRunningMethod() để được thực thi song song trên tất cả các lõi khi có thể. – as74

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