Асинхронная обертка над классом - C#
Формулировка задачи:
Доброго времени суток!
Заранее извиняюсь если не в ту ветку.
Суть в следующем - лазил недавно в поисках задач по C# для саморазвития и наткнулся на вот такое:
::::
Есть библиотечный класс, занимающийся сборкой шарповых проектов. В тестовых целях предположим, что он выглядит так:
Задача: написать асинхронную обёртку над Compiler-ом, которая будет с его помощью реализовывать фоновую сборку проектов. Этот класс должен удовлетворять следующим требованиям:
- Необходимо возвращать управление вызывающему коду, не дожидаясь полной сборки проекта.
- После того как проект будет собран, вызывающий код должен иметь возможность получить байты с результатом.
- В то время, когда один проект уже обрабатывается, наш класс могут попросить собрать ещё что-нибудь. При этом одновременно можно собирать не более одного проекта - новые задачи должны выполниться, когда компилятор освободится.
- Реализация должна быть потокобезопасной.
END.
::::
А вопрос, вернее просьба такая - проясните что вообще нужно было сделать. Да, понимаю что вопрос глупый но подскажите хоть какие темы читать что бы разобраться и решить.
PS Решений не прошу, только ссылки на литературу и общие пояснения а то даже задачи не понял.
Спасибо!
Листинг программы
- public class Compiler
- {
- public byte[] BuildProject( string projectPath )
- {
- // работа ....
- Thread.Sleep( 500 );
- // В реальности здесь будут байты собранной dll-ки.
- return Encoding.UTF8.GetBytes( FilePath );
- }
- }
Решение задачи: «Асинхронная обертка над классом»
textual
Листинг программы
- public class Compiler
- {
- public byte[] BuildProject(string projectPath)
- {
- throw null;
- }
- }
- public class AsyncCompiler
- {
- Compiler compiler = new Compiler();
- object lockObject = new object();
- byte[] BuildProjectInternal(string projectPath)
- {
- lock (lockObject)
- {
- return compiler.BuildProject(projectPath);
- }
- }
- public Task<byte[]> BuildProjectAsync(string projectPath)
- {
- var tcs = new TaskCompletionSource<byte[]>();
- Task.Run(() =>
- {
- try
- {
- var result = BuildProjectInternal(projectPath);
- tcs.SetResult(result);
- }
- catch (Exception ex)
- {
- tcs.SetException(ex);
- }
- });
- return tcs.Task;
- //return Task.Run(() => BuildProjectInternal(projectPath));
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- var compiler = new AsyncCompiler();
- for (int i = 1; i <= 4; i++)
- {
- int num = i;
- try
- {
- CompileAndShow("project" + num, compiler);
- }
- catch(Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- }
- Console.ReadLine();
- }
- static void CompileAndShow(string projectPath, AsyncCompiler compiler)
- {
- Console.WriteLine(projectPath + " is ready to be compiled");
- byte[] result = compiler.BuildProjectAsync(projectPath).Result;
- Console.WriteLine(projectPath + " has been compiled to: " + string.Join("", result));
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д