2012-10-29 4 views
11

값을 반환하고 매개 변수를 사용하는 작업을 어떻게 실행합니까? 오버로드 된 메서드가 있다는 것을 알았습니다. Task.Run<TResult>(Func<TResult>)하지만 어떻게 매개 변수를 전달할 수 있습니까?Task.Run 및 Func <>

답변

27

Func<TResult> 매개 변수를 사용하지 않습니다. 일반적으로 매개 변수 대신 람다 식을 사용합니다. 예를 들어 :

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

그래서 심지어 그냥 Func<int>을 만들 불구하고, 그것은 메소드 매개 변수를 사용하여 을의 ... 캡처 변수입니다.

+0

스레드가 안전합니까? – BVernon

+0

@BVernon : 나중에'text'의 값을 변경하지 않는다고 가정하면, 괜찮아 보입니다. –

+0

나는 정말로 기본적인 것들을 잊고 있다고 생각한다. DoSomething을 텍스트에 대해 다른 값으로 여러 번 호출하면 각 호출마다 메모리에 각 버전의 복사본이 생기 겠지? – BVernon

6

Task.Factory.StartNew() 오버로드를 사용하여 사용하려는 모든 매개 변수가 들어있는 "상태"개체를 전달할 수 있습니다. 여기에 NameValueCollection을 전달하는 아주 기본적인 예제가 있지만 원하는 모든 유형의 객체를 전달할 수 있습니다.

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!" } }); 
관련 문제