2009-11-22 4 views
3
질문 regaridng이 게시물에 여기 Completly 새로운

이 특정 ThreadPool.QueueUserWorkItem with a lambda expression and anonymous method의 C#/람다 : 오브젝트 매개 변수 설명 요청 (멍청한 놈)

:

ThreadPool.QueueUserWorkItem(
    o => test.DoWork(s1, s2) 
    ); 

누군가가 '오'가 무엇인지 설명해 주시겠습니까? 나는 그것이 (VS2008에서) 객체 매개 변수라는 것을 볼 수 있지만 기본적으로 왜 그리고 어떻게 이해하지 못한다.

public delegate void WaitCallback(
    Object state 
) 

상태의 정의는 : 따라서

Type: System.Object 
An object containing information to be used by the callback method. 

첫번째 파라미터 QueueUserWorkItemdocumentation 가입일

답변

10

ThreadPool.QueueUserWorkItem에는 인수로 WaitCallback 대리자가 필요합니다.

이 대리자 형식은 void 형식의 하나의 인수가 Object 인 함수에 해당합니다.

ThreadPool.QueueUserWorkItem(
    (object state) => { test.DoWork(s1,s2); }; 
); 
:

그래서 통화의 전체 버전은 우리가 더 짧은 형태로 쓸 수

ThreadPool.QueueUserWorkItem(
    new WaitCallback(delegate(object state) { test.DoWork(s1,s2); }); 
); 

더 간결은 C# 3.0 구문을 사용

ThreadPool.QueueUserWorkItem(
    delegate(object state) { test.DoWork(s1,s2); }; 
); 

이 될 것입니다 수

C# 3.0 람다 구문을 사용하면 state의 형식을 생략 할 수 있습니다. 이 인수는 실제로 필요하지 않으므로 형식의 첫 번째 문자로 축약됩니다.

+0

감사합니다. 너는 그것을 아주 분명하게했다. – Moberg

1

는 첫 번째 파라미터는 다음의 정의와 WaitCallbackQueueUserWorkItem은 객체 (선택적 사용자 상태)를 취하고 void를 반환하는 함수입니다. 코드에서 o는 사용자 상태 객체입니다. 이 경우에는 사용되지 않지만 반드시 있어야합니다.

+0

이되었다 또한 도움. 고마워. – Moberg

0

그냥 look it up : o은 오버로드 된 버전 QueueUserWorkItem을 사용하여 실행 된 메서드에 전달할 수있는 상태 개체입니다. 명시 적으로 전달하지 않으면 null입니다.

이 방법은 람다 식을 사용할 수없는 경우 유용합니다.

+0

OP가 찾고있는 것이 람다 식의 단순한 영어 설명이라고 생각합니다. –

0

o은 람다 함수에 대한 형식적인 매개 변수입니다. 유형은 QueueUserWorkItem의 매개 변수 유형에 의해 파생됩니다.

0

다른 대답은 좋은,하지만 당신은 동등한 (그것에게 .NET 한 방법을 수행 즉,) 람다 식이나 위임 방법도 사용하지 않고 무엇을 볼 경우 어쩌면 도움 :

void SomeMethod() 
{ 
    //... 
    ThreadPool.QueueUserWorkItem(new WaitCallback(TheCallback)); 
    //... 
} 

void TheCallback(object o) 
{ 
    test.DoWork(s1, s2); 
} 
관련 문제