Я работаю над веб-приложением .net core 3.0 и решил использовать System.Threading.Channels в одноэлементном сервисе. Верхний уровень моих служб запросов с областью действия внедряет этот синглтон для доступа к его каналам.
Я решил использовать этот шаблон для отделения запросов (которые производят прямые обновления для других подключенных клиентов) от выполнения этих обновлений.
Реализация ОДНОГО канала в объекте имеет много примеров.
Может кто-нибудь сказать мне, возможно ли / желательно ли использовать несколько каналов в моем синглтоне?
У меня пока нет проблем с созданием нескольких каналов и их "запуском" при создании синглтона. Мне просто не дошло до того, что я могу протестировать запросы нескольких клиентов на разных каналах синглтона, чтобы проверить, хорошо ли это работает. (Или вообще? ...)
Моя основная мотивация использования нескольких каналов - я хочу, чтобы синглтон делал разные вещи в зависимости от типа элемента в канале.
public class MyChannelSingleton
{
public Channel<MyType> TypeOneChannel = Channel.CreateUnbounded<MyType>();
public Channel<MyOtherType> TypeTwoChannel = Channel.CreateUnbounded<MyOtherType>();
public MyChannelSingleton()
{
StartChannels();
}
private void StartChannels()
{
// discarded async tasks due to calling in ctor
_ = StartTypeOneChannel();
_ = StartTypeTwoChannel();
}
private async Task StartTypeOneChannel()
{
var reader = TypeOneChannel.Reader;
while (await reader.WaitToReadAsync())
{
if (reader.TryRead(out MyType item))
{
// item is sucessfully read from channel
}
}
}
private async Task StartTypeTwoChannel()
{
var reader = TypeTwoChannel.Reader;
while (await reader.WaitToReadAsync())
{
if (reader.TryRead(out MyOtherType item))
{
// item is sucessfully read from channel
}
}
}
}
Я также ожидаю, что никогда не "завершу" каналы и не предоставлю их в течение всего срока действия приложения.