Асинхронная обертка над классом - 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)); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д