我正在测试代表,我停止了 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!