0

我正在测试代表,我停止了 BeginInvoke 和 EndInvoke。我想知道这个同伴代码中发生了什么。

我虽然第一个开始调用将在第二个之后终止,因为第二个只有 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!最好的终结者!

不应该吗?

最好的终结者!一个est terminée!

4

1 回答 1

1

你明确地调用EndInvoke

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