"</html>"};
var handlers = new List<Delegate>() { PrintTag, AddStyle };
var awaitableTasks = from tag in htmlTags
let sem = new SemaphoreSlim(0, 1)
from task in handlers
select (Task)(task.DynamicInvoke(tag, sem));
await Task.WhenAll(awaitableTasks);
async Task PrintTag(string tag, SemaphoreSlim gate)
{
await gate.WaitAsync();
Console.WriteLine(tag);
gate.Release();
}
async Task AddStyle(string tag, SemaphoreSlim gate)
{
var lastQuoteIndex = tag.IndexOf('>');
await Task.Delay(100);
tag = tag[0..lastQuoteIndex] + "style = \"color:blue;\"" + tag[lastQuoteIndex..];
gate.Release();
}
Шо не так с этим кодом? Я передаю в таски два объекта - string и SemaphoreSlim, и семафор передаётся корректно, т.е. в каждую пару тасков передаётся одинаковый объект семафора, я проверил их хешкод, но при этом, я передаю string в эти два метода, и почему то ссылка стринг не указывает на один и тот же объект, то есть изменения не применяются. Может попробовать использовать класс StringBuilder?
эм. а разве стринг не иммутабл и при изменении у тебя не появляется другой объект - соотв референс меняется?
ну наверное в этом причина, сейчас попробую через стрингбилдер сделать решение
а так чисто для цікавості якщо додати ref? async Task PrintTag(ref string tag, SemaphoreSlim gate) та async Task AddStyle(ref string tag, SemaphoreSlim gate) ?
а нельзя реф в асинк методы
Тут або якийсь mutable тип на кшталт StringBuilder, або ще краще щоб метод повертав Task<string> і читати його результат
Ну можно через continuewith было сделать, но я хотел семафоры использовать
Обсуждают сегодня