2014-02-17 4 views
0

이있는 메서드 전달 기본적으로 T는 반환 형식이 있으므로 일반 반환 형식을 반환하고 싶습니다. 예 :매개 변수 Func <T> 및 TResult

어떻게 T를 호출하고 TResult를 얻습니까? 너는 나에게 단지 T가있다.

EDIT : 나는이 방법을 어떻게 부르는가?

EDIT : 내가 다른 EndInvokes에서 거대한 try catch이기 때문에 일반적인 EndInvoke를 원한다. 그런 다음 EndInvoke에서 결과를 원한다.

+1

제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –

+0

'기본적으로 T에는 반환 값 타입이 있습니다. 사실, 반환 값 타입은'TResult'입니다. 질문은 불분명하다. –

+0

이 함수는 (BeginInvoke라고하는 다른 함수와 함께) 비동기 호출을 사용하는 것과 같습니다. 'T' 만 가지고 있고,'asyncCaller'를 호출하고, 그 똑같은 함수로 결과를 다루고 싶다면, 동기 호출 만 사용할 수 있습니다. 당신이하려고하는 것이 무엇인지 명확히 할 수 있습니까? – hvd

답변

0

정확하게 이해할지는 모르겠지만 Func 반환 값을 원한다면 IAsyncResult를 삭제해야한다고 생각합니다.

예 : 내가 처음 확장 방법에 일반적인 EndInvoke<,> 방법을 변환 제안

private TResult GetResult<T, TResult>(Func<T, TResult> asyncCaller, IAsyncResult asyncResult) 
    { 
     TResult result = default(TResult); 
     result = asyncCaller(argument...); 

     return result; 
    } 
+0

질문에서 기능의 이름, 'EndInvoke'와'IAsyncResult'는 비동기 호출이 이미 만들어 졌다고 제안합니다. – hvd

1

.

public static class FuncExtensions 
{ 
    public static TResult EndInvoke<T, TResult>(this Func<T, TResult> asyncCaller, IAsyncResult asyncResult) 
    { 
     // ... 
    } 
} 

이렇게하면 메서드 호출이 간단 해집니다. 예를 들어, 정수의 제곱을 계산하는 메소드를 호출합니다.

Func<int, int> caller = new Func<int, int>(Square); 

int x = 5; 

int y = default(int); 

caller.BeginInvoke(x, 
    asyncResult => 
    { 
     y = caller.EndInvoke(asyncResult); 
    }, 
    null); 

Console.WriteLine("The square of {0} is {1}", x, y); 

편집

이 예는 어떤 방식으로 테스트되지 않았습니다, 그리고 명백한 경쟁 조건이 포함되어 클라이언트 코드에서

private int Square(int x) 
{ 
    return x * x; 
} 

,이 같이 호출 것 .