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

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

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

Доброго времени суток! Заранее извиняюсь если не в ту ветку. Суть в следующем - лазил недавно в поисках задач по C# для саморазвития и наткнулся на вот такое: :::: Есть библиотечный класс, занимающийся сборкой шарповых проектов. В тестовых целях предположим, что он выглядит так:
public class Compiler
 
{
 
    public byte[] BuildProject( string projectPath )
 
    {
 
        // работа ....
 
        Thread.Sleep( 500 );

        // В реальности здесь будут байты собранной dll-ки.
 
        return Encoding.UTF8.GetBytes( FilePath );
 
    }
 
}
Задача: написать асинхронную обёртку над Compiler-ом, которая будет с его помощью реализовывать фоновую сборку проектов. Этот класс должен удовлетворять следующим требованиям: - Необходимо возвращать управление вызывающему коду, не дожидаясь полной сборки проекта. - После того как проект будет собран, вызывающий код должен иметь возможность получить байты с результатом. - В то время, когда один проект уже обрабатывается, наш класс могут попросить собрать ещё что-нибудь. При этом одновременно можно собирать не более одного проекта - новые задачи должны выполниться, когда компилятор освободится. - Реализация должна быть потокобезопасной. END. :::: А вопрос, вернее просьба такая - проясните что вообще нужно было сделать. Да, понимаю что вопрос глупый но подскажите хоть какие темы читать что бы разобраться и решить. PS Решений не прошу, только ссылки на литературу и общие пояснения а то даже задачи не понял. Спасибо!

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

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));
        }
    }

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


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

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

9   голосов , оценка 4.333 из 5
Похожие ответы