Асинхронная обертка над классом - 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));
}
}