Outils pour utilisateurs

Outils du site


developpement:dotnet:csharp:introduction

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
Dernière révisionLes deux révisions suivantes
developpement:dotnet:csharp:introduction [2023/10/04 20:58] – [Task Parallel Library (TPL)] sgariepydeveloppement:dotnet:csharp:introduction [2023/10/05 15:11] – [PLINQ] sgariepy
Ligne 1376: Ligne 1376:
 } }
 </code> </code>
 +
 +===== Continuation with state =====
 +
 +<code csharp>
 +void Main()
 +{
 +    Task<DateTime> task = Task.Run(() => DoSomething());
 +    List<Task<DateTime>> continuationTasks = new List<Task<DateTime>>();
 +    
 +    for (int i = 0; i < 3; i++)
 +    {
 +        task = task.ContinueWith((x, y) => DoSomething(), new Person { Id = i });
 +        continuationTasks.Add(task);
 +    }
 +    
 +    task.Wait();
 +    
 +    foreach (var continuation in continuationTasks)
 +    {
 +        Person person = continuation.AsyncState as Person;
 +        Console.WriteLine("Task finished at " + continuation.Result + ". Person id is {0}", person.Id);
 +    }
 +}
 +
 +static DateTime DoSomething()
 +{
 +    return DateTime.Now;
 +}
 +
 +internal class Person
 +{
 +    public int Id { get; set; }
 +}
 +</code>
 +
 +===== TaskCompletionSource =====
 +
 +<code csharp>
 +void Main()
 +{
 +    TaskCompletionSource<Product> taskCompletionSource = new TaskCompletionSource<Product>();
 +    Task<Product> lazyTask = taskCompletionSource.Task;
 +    
 +    Task.Factory.StartNew(() => {
 +        Thread.Sleep(2000);
 +        taskCompletionSource.SetResult(new Product { Id = 1, Name = "Some name" });
 +    });
 +    
 +    Task.Factory.StartNew(() =>
 +    {
 +        if (Console.ReadLine() == "x")
 +        {
 +            Product result = lazyTask.Result;
 +            Console.WriteLine("Result is {0}", result.Name);
 +        }
 +    });
 +    
 +    Thread.Sleep(5000);
 +}
 +
 +class Product
 +{
 +    public int Id { get; set; }
 +    public string Name { get; set; }
 +}
 +
 +</code>
 +
 +===== PLINQ =====
 +
 +Parallel LINQ:
 +
 +  * Automates parallelization
 +  * Considéré déclaratif plutôt qu'impératif
 +  * Opérateurs qui font en sorte que ce n'est pas parallélisé:
 +    * Take, Select, SelectMany, Skip, TakeWhile, SkipWhile, ElementAt
 +  * Anomalies
 +    * Join, GroupBy, GroupJoin, Distinct, Union, Intersect, Except
 +  * Force parallelism:
 +    * .AsParallel().withExecutionMode(ParallelExecution.ForceParallelism)
 +
 +
 +<code csharp>
 +void Main()
 +{
 +    var list = Enumerable.Range(1, 100000);
 +    var primeNumbers = list
 +                        .AsParallel()
 +                        .Where(IsPrime);
 +    Console.WriteLine("{0} prime numbers", primeNumbers.Count());
 +}
 +
 +bool IsPrime(int x)
 +{
 +    if (x == 1) return false;
 +    if (x == 2) return true;
 +    if (x % 2 == 0) return false;
 +    var boundary = (int)Math.Floor(Math.Sqrt(x));
 +
 +    for (int i = 3; i <= boundary; i += 2)
 +    {
 +        if (x % i == 0)
 +        {
 +            return false;
 +        }
 +    }
 +    return true;    
 +}
 +</code>
 +
 +==== Degree of Parallelism ====
 +
 +<code csharp>
 +void Main()
 +{
 +    List<string> websites = new List<string>();
 +    websites.Add("apple.com");
 +    websites.Add("google.com");
 +    websites.Add("microsoft.com");
 +    
 +    List<PingReply> responses = websites
 +                                    .AsParallel()
 +                                    .WithDegreeOfParallelism(websites.Count())
 +                                    .Select(PingSites)
 +                                    .ToList();
 +    
 +    foreach (var response in responses)
 +    {
 +        Console.WriteLine(response.Address + " " + response.Status + " " + response.RoundtripTime);
 +    }
 +    
 +    Console.ReadLine();
 +}
 +
 +private static PingReply PingSites(string websiteName)
 +{
 +    Ping ping = new Ping();
 +    return ping.Send(websiteName);
 +}
 +</code>
 +
 +
  
  
developpement/dotnet/csharp/introduction.txt · Dernière modification : 2023/10/06 05:06 de sgariepy