2012-10-29 40 views
11

Làm cách nào để chạy Tác vụ trả về giá trị và nhận tham số? Tôi thấy rằng có một phương pháp quá tải Task.Run<TResult>(Func<TResult>) nhưng làm thế nào tôi có thể vượt qua một tham số ở đó?Task.Run và Func <>

Trả lời

27

Func<TResult> không tham số. Thông thường, bạn sẽ cần chụp tham số bằng cách sử dụng biểu thức lambda thay thế. Ví dụ:

public void DoSomething(string text) 
{ 
    Task<int> task = Task.Run(() => text.Length); 
    ... 
} 

đây text là một bắt biến ... do đó, ngay cả khi bạn chỉ cần tạo một Func<int>, nó sử dụng tham số phương pháp.

+0

Chủ đề đó có an toàn không? – BVernon

+0

@BVernon: Giả sử bạn không thay đổi giá trị của 'văn bản' sau này, có vẻ ổn với tôi. –

+0

Tôi nghĩ rằng tôi chỉ quên một số công cụ thực sự cơ bản ... nếu tôi gọi DoSomething nhiều lần với các giá trị khác nhau cho văn bản thì sẽ có một bản sao của mỗi phiên bản trong bộ nhớ cho mỗi cuộc gọi, phải không? – BVernon

6

Bạn có thể sử dụng quá tải Task.Factory.StartNew() để truyền trong đối tượng "trạng thái" chứa tất cả các tham số bạn muốn sử dụng. Dưới đây là một ví dụ rất cơ bản đi qua trong một NameValueCollection, nhưng bạn rõ ràng có thể vượt qua trong bất kỳ loại đối tượng mà bạn muốn.

Task<bool>.Factory.StartNew(
    (a) => { 
     NameValueCollection nvc = a as NameValueCollection; 
     if(nvc != null) { 
      nvc.AllKeys.ForEach(k => Console.WriteLine(nvc[k])); 
     } 
     return true; 
    }, 
    new NameValueCollection() { { "param1", "hithere!" } }); 
Các vấn đề liên quan