0

I was testing delegates and ive stopped on BeginInvoke and EndInvoke. I wonder what happen in this fellowing code.

I though that the first begin invoke would terminate after the second since the second is only 2 seconds and the first one is 3 seconds. Don't this make it like its a sync call ? Why ?

It seem the actual call is only called when EndInvoke is used.

/// <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;
    }

}

This output :

A est terminée! B est terminée!

Shouldn't it be ?

B est terminée! A est terminée!

4

1 に答える 1

1

あなたは明示的に呼び出していますEndInvoke:

strReturnedData = dlgt.EndInvoke(arA);

デリゲートが終了するまで待機します。を渡すと、最初のデリゲート呼び出しが完了するまで待つarAことしかできません。最初のデリゲートの結果が必要だと明示的に言っているため、2 番目のデリゲート呼び出しでは何もできない可能性があります。

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!
于 2012-10-15T17:07:08.580 に答える