Асинхронная обертка над классом - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Заранее извиняюсь если не в ту ветку. Суть в следующем - лазил недавно в поисках задач по C# для саморазвития и наткнулся на вот такое: :::: Есть библиотечный класс, занимающийся сборкой шарповых проектов. В тестовых целях предположим, что он выглядит так:
Листинг программы
  1. public class Compiler
  2. {
  3. public byte[] BuildProject( string projectPath )
  4. {
  5. // работа ....
  6. Thread.Sleep( 500 );
  7.  
  8. // В реальности здесь будут байты собранной dll-ки.
  9. return Encoding.UTF8.GetBytes( FilePath );
  10. }
  11. }
Задача: написать асинхронную обёртку над Compiler-ом, которая будет с его помощью реализовывать фоновую сборку проектов. Этот класс должен удовлетворять следующим требованиям: - Необходимо возвращать управление вызывающему коду, не дожидаясь полной сборки проекта. - После того как проект будет собран, вызывающий код должен иметь возможность получить байты с результатом. - В то время, когда один проект уже обрабатывается, наш класс могут попросить собрать ещё что-нибудь. При этом одновременно можно собирать не более одного проекта - новые задачи должны выполниться, когда компилятор освободится. - Реализация должна быть потокобезопасной. END. :::: А вопрос, вернее просьба такая - проясните что вообще нужно было сделать. Да, понимаю что вопрос глупый но подскажите хоть какие темы читать что бы разобраться и решить. PS Решений не прошу, только ссылки на литературу и общие пояснения а то даже задачи не понял. Спасибо!

Решение задачи: «Асинхронная обертка над классом»

textual
Листинг программы
  1. public class Compiler
  2.     {
  3.         public byte[] BuildProject(string projectPath)
  4.         {
  5.             throw null;
  6.         }
  7.     }
  8.  
  9.  
  10.     public class AsyncCompiler
  11.     {
  12.         Compiler compiler = new Compiler();
  13.         object lockObject = new object();
  14.  
  15.         byte[] BuildProjectInternal(string projectPath)
  16.         {
  17.             lock (lockObject)
  18.             {
  19.                 return compiler.BuildProject(projectPath);
  20.             }
  21.        
  22.         }
  23.  
  24.         public Task<byte[]> BuildProjectAsync(string projectPath)
  25.         {
  26.             var tcs = new TaskCompletionSource<byte[]>();
  27.             Task.Run(() =>
  28.             {
  29.                 try
  30.                 {
  31.                     var result = BuildProjectInternal(projectPath);
  32.                     tcs.SetResult(result);
  33.                 }
  34.                 catch (Exception ex)
  35.                 {
  36.                     tcs.SetException(ex);
  37.                 }
  38.             });
  39.  
  40.  
  41.             return tcs.Task;
  42.  
  43.  
  44.             //return Task.Run(() => BuildProjectInternal(projectPath));
  45.  
  46.         }
  47.     }
  48.    
  49.  
  50.     class Program
  51.     {
  52.         static void Main(string[] args)
  53.         {
  54.             var compiler = new AsyncCompiler();
  55.  
  56.             for (int i = 1; i <= 4; i++)
  57.             {
  58.                 int num = i;
  59.                 try
  60.                 {
  61.                     CompileAndShow("project" + num, compiler);
  62.                 }
  63.                 catch(Exception ex)
  64.                 {
  65.                     Console.WriteLine(ex.Message);
  66.                 }
  67.             }
  68.  
  69.             Console.ReadLine();
  70.         }
  71.  
  72.  
  73.         static void CompileAndShow(string projectPath, AsyncCompiler compiler)
  74.         {
  75.  
  76.             Console.WriteLine(projectPath + " is ready to be compiled");
  77.             byte[] result = compiler.BuildProjectAsync(projectPath).Result;
  78.             Console.WriteLine(projectPath + " has been compiled to: " + string.Join("", result));
  79.         }
  80.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.333 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы