2012-10-15 2 views
0

대리인을 테스트하고 BeginInvoke 및 EndInvoke에서 IVE를 중지했습니다. 이 동료 코드에서 어떤 일이 일어 났는지 궁금합니다.BeginInvoke 첫 번째 호출이 먼저 완료된 이유는 무엇입니까?

하지만 첫 번째 시작 호출은 초가 2 초이고 첫 번째 호출이 3 초이므로 두 번째 이후에 종료됩니다. 이렇게하면 동기화 통화가되지 않습니까? 왜 ?

실제 호출은 EndInvoke가 사용될 때만 호출되는 것처럼 보입니다.

/// <summary> 
/// Démonstration d'un appel d'une méthode ASYNCRONE avec BeginInvoke() SANS rappel (Callback). 
/// </summary> 
public class AsyncBeginInvokeDemo 
{ 
    // Voici la méthode délégué. 
    // L'équivalent: Func<int, string> (Func<In1, ..., Out>) 
    // Note: Aurait pu être également Action<int> si la méthode ne retourne pas de valeurs. 
    delegate string MethodDelegate(int iCallTime, string message); 

    /// <summary> 
    /// Démarrer la démonstration. 
    /// </summary> 
    public void Start() 
    { 
     string strReturnedData = String.Empty; 

     // Attaché la méthode au délégué. 
     MethodDelegate dlgt = new MethodDelegate(this.LongRunningMethod); 

     // Initié l'appel asyncrone A. 
     IAsyncResult arA = dlgt.BeginInvoke(3000, "A est terminée!", null, null); 

     // Initié l'appel asyncrone B. 
     IAsyncResult arB = dlgt.BeginInvoke(2000, "B est terminée!", null, null); 

     // Retrieve the results of the asynchronous call. 
     strReturnedData = dlgt.EndInvoke(arA); 
     Console.WriteLine(strReturnedData); 
     strReturnedData = dlgt.EndInvoke(arB); 
     Console.WriteLine(strReturnedData); 
    } 

    /// <summary> 
    /// Il s'agit de l'opération à executé. 
    /// </summary> 
    /// <param name="iCallTime">Temps d'execution de l'opération. (Simulation)</param> 
    /// <returns>Données par l'opération. (Simulation)</returns> 
    public string LongRunningMethod(int iCallTime, string message) 
    { 
     // Mettre le thread en attente pendant un nombre de milliseconde x. 
     Thread.Sleep(iCallTime); 

     // Retourner des données. 
     return message; 
    } 

} 

이 출력 :

EST로 terminée! 끝까지 기다려주세요!

B est terminée! 끝내기! 당신은 명시 적으로 EndInvoke를 호출하고

+0

를, 그것은 변환 가치가 있었을 것이다 게시하기 전에 영어로 귀하의 모든 의견 ... –

답변

1

: 대리인이 완료 될 때까지 을 기다립니다

strReturnedData = dlgt.EndInvoke(arA); 

. arA을 전달하면 만 완료되고 첫 번째 대리인이 끝날 때까지 대기합니다. 첫 번째 대리인의 결과를 원한다고 분명히 말하고 있기 때문에 두 번째 대리자 호출을 사용하여 아무 것도 할 수 없습니다.

실제 호출은 EndInvoke가 사용될 때만 호출되는 것처럼 보입니다.

아니오, 대리인이 이 완료 될 때까지 차단하면됩니다.입니다. 이 코드를 추가하는 경우

단지 return message; 전에 :

Console.WriteLine("Finished {0}", message); 

가 그런 다음의 출력을 볼 수 있습니다 : 스택 오버플로가 영어 사이트입니다 점을 감안

Finished B est terminée! 
Finished A est terminée! 
A est terminée! 
B est terminée! 
+0

그게 내가 뭘! 확인해 주셔서 감사합니다! – Rushino

+0

@ 루시 노 : 아니요, 당신이 분명히 * EndInvoke가 호출되었을 때 대리인이 시작되었다고 생각한 것 같습니다. 내 편집을 참조하십시오. –

+0

정확합니다. 하지만 그 말은 내가 '그게 무슨 뜻인지'라고 말한 것이 아닙니다. 나는 당신이 대답하기 바로 전에 이것에 대해 생각합니다. 나는 아마도 EndInvoke가 호출이 완료 될 때까지 기다릴 것이라고 말했고, 이것은 당신이 뭔가를 반환하기를 원하기 때문에 의미가 있습니다. 그 이유는 내가 '그게 뭔지'내 의견의 혼란에 대한 죄송합니다. 또한, 콜백을 사용하면 이러한 종류의 오류를 피할 수있는 좋은 방법 일 수 있습니다. – Rushino

관련 문제