2013-08-15 2 views
0

BeginInvoke를 사용하여 호출되는 Func<t>의 값을 어떻게 구합니까? 예를 들어Func <t>에서 async라는 값을 어떻게 얻습니까?

:

private void MyTest() 
{ 
    Func<string> foo = Bar; 

    foo.BeginInvoke(BarComplete, null); 
} 

private string Bar() 
{ 
    return "Success"; 
} 

private void BarComplete(IAsyncResult ar) 
{ 
    var result = (string) ar.AsyncState; 

    Console.WriteLine(result); // Should print "Success" 
} 

은 내가 AsyncCallback이 캐스팅 후 EndInvoke를 호출해야합니까?

어쨌든 피드백에 감사드립니다.

+0

단순히 호출은'호출은()'옵션, 즉 너무 일을한다면. – 48klocs

답변

3

AsyncState에는 null이 두 번째 매개 변수로 전달되므로 foo 개체를 대신 전달해야합니다. 결과를 얻으려면 을 foo 객체에서 호출해야하며 결과의 객체 버전을 반환합니다.

private void MyTest() 
{ 
    Func<string> foo = Bar; 

    foo.BeginInvoke(BarComplete, foo); 
} 

private string Bar() 
{ 
    return "Success"; 
} 

private void BarComplete(IAsyncResult ar) 
{ 
    var foo = (Func<string>)ar.AsyncState; 
    var uncastResult = foo.EndInvoke(ar); //This returns a "object", but it would still work with WriteLine 
    var castResult = (string)uncastResult; 

    Console.WriteLine(uncastResult); // Should print "Success" 
    Console.WriteLine(castResult); // Should also print "Success" 
} 
+0

'BarComplete'에서'foo'가 어디입니까? 그는 그 범위에 존재하지 않습니다, 그렇죠? – elucid8

+0

잡담! 고마워, 친구! – elucid8

+0

'BarComplete'에서'foo()'를 호출하고'string'을 얻을 수 없습니까? 그 시점에서, 그것은 보통'Func '입니다. – vlad