День 1219. #ЧтоНовенького
Транскодинг JSON в gRPC для .NET
gRPC — это современный способ связи между приложениями. gRPC использует HTTP/2, потоковую передачу, двоичную сериализацию и контракты сообщений для создания высокопроизводительных сервисов реального времени. .NET поддерживает создание приложений gRPC.
Однако, как и при выборе большинства технологий, при выборе gRPC по сравнению с альтернативой, такой как REST + JSON, есть компромиссы. К сильным сторонам gRPC относятся производительность и продуктивность разработчиков. Между тем, REST+JSON можно использовать везде, а его удобочитаемые сообщения JSON легко отлаживать.
Транскодинг JSON в gRPC — это расширение для ASP.NET Core, которое создаёт RESTful API для служб gRPC. После настройки транскодинг JSON позволяет вызывать методы gRPC со знакомыми HTTP концепциями:
- HTTP-глаголы
- Привязка параметров URL
- Запросы/ответы в JSON
Начало работы
1. Создайте службу gRPC. Вот здесь руководство.
2. Добавьте на сервер ссылку на пакет Microsoft.AspNetCore.Grpc.JsonTranscoding и зарегистрируйте его в коде запуска. Например:
Оба варианта позволяют вызывать службы gRPC из браузера. Различаются способы достижения этого:
- gRPC-Web позволяет браузерным приложениям вызывать службы gRPC из браузера с помощью клиента gRPC-Web и Protobuf. Он требует, чтобы приложение создавало клиент gRPC, и имеет преимущество в отправке небольших и быстрых сообщений Protobuf.
- Транскодинг JSON позволяет приложениям вызывать службы gRPC как RESTful API с JSON. Приложению не нужно создавать клиент gRPC или знать что-либо о gRPC.
Реализация
Транскодинг JSON не является новой концепцией. grpc-gateway — это еще одна технология для создания RESTful JSON API из служб gRPC. Он использует те же аннотации .proto для сопоставления концепций HTTP со службами gRPC. Однако grpc-gateway использует генерацию кода для создания обратного прокси-сервера, который переводит вызовы RESTful в gRPC+Protobuf и отправляет их через HTTP/2 в службу gRPC. Преимущество этого подхода заключается в том, что служба gRPC не знает о RESTful API. Любой сервер gRPC может использовать grpc-gateway.
Транскодинг JSON выполняется внутри приложения ASP.NET Core. Он десериализует JSON в сообщения Protobuf, а затем напрямую вызывает службу gRPC. Это даёт преимущества для разработчиков приложений .NET:
- И службы gRPC, и сопоставленный RESTful JSON API выполняются из одного приложения ASP.NET Core.
- Транскодинг JSON десериализует сообщения JSON в Protobuf и напрямую вызывает службу gRPC. Выполнение этого в процессе даёт значительные преимущества в производительности по сравнению с новым gRPC-вызовом на другой сервер.
Что дальше
Транскодинг JSON в gRPC доступен в .NET 7 Превью 4. Это первый выпуск. Будущие версии .NET 7 будут сосредоточены на повышении производительности и поддержке OpenAPI.
Подробная информация доступна в документации. Также можно посмотреть пример приложения или видео с демонстрацией функционала.
Источник: https://devblogs.microsoft.com/dotnet/announcing-grpc-json-transcoding-for-dotnet/
Транскодинг JSON в gRPC для .NET
gRPC — это современный способ связи между приложениями. gRPC использует HTTP/2, потоковую передачу, двоичную сериализацию и контракты сообщений для создания высокопроизводительных сервисов реального времени. .NET поддерживает создание приложений gRPC.
Однако, как и при выборе большинства технологий, при выборе gRPC по сравнению с альтернативой, такой как REST + JSON, есть компромиссы. К сильным сторонам gRPC относятся производительность и продуктивность разработчиков. Между тем, REST+JSON можно использовать везде, а его удобочитаемые сообщения JSON легко отлаживать.
Транскодинг JSON в gRPC — это расширение для ASP.NET Core, которое создаёт RESTful API для служб gRPC. После настройки транскодинг JSON позволяет вызывать методы gRPC со знакомыми HTTP концепциями:
- HTTP-глаголы
- Привязка параметров URL
- Запросы/ответы в JSON
Начало работы
1. Создайте службу gRPC. Вот здесь руководство.
2. Добавьте на сервер ссылку на пакет Microsoft.AspNetCore.Grpc.JsonTranscoding и зарегистрируйте его в коде запуска. Например:
services.AddGrpc().AddJsonTranscoding();3. Добавьте аннотации файла .proto для привязки и маршрутов HTTP. Для этого сохраните себе файлы annotations.proto и http.proto в папку google/api вашего проекта и добавьте в ваш файл .proto строку
syntax = "proto3";Транскодинг JSON или gRPC-Web
import "google/api/annotations.proto";
package greet;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {
option (google.api.http) = {
get: "/v1/greeter/{name}"
};
}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
Оба варианта позволяют вызывать службы gRPC из браузера. Различаются способы достижения этого:
- gRPC-Web позволяет браузерным приложениям вызывать службы gRPC из браузера с помощью клиента gRPC-Web и Protobuf. Он требует, чтобы приложение создавало клиент gRPC, и имеет преимущество в отправке небольших и быстрых сообщений Protobuf.
- Транскодинг JSON позволяет приложениям вызывать службы gRPC как RESTful API с JSON. Приложению не нужно создавать клиент gRPC или знать что-либо о gRPC.
Реализация
Транскодинг JSON не является новой концепцией. grpc-gateway — это еще одна технология для создания RESTful JSON API из служб gRPC. Он использует те же аннотации .proto для сопоставления концепций HTTP со службами gRPC. Однако grpc-gateway использует генерацию кода для создания обратного прокси-сервера, который переводит вызовы RESTful в gRPC+Protobuf и отправляет их через HTTP/2 в службу gRPC. Преимущество этого подхода заключается в том, что служба gRPC не знает о RESTful API. Любой сервер gRPC может использовать grpc-gateway.
Транскодинг JSON выполняется внутри приложения ASP.NET Core. Он десериализует JSON в сообщения Protobuf, а затем напрямую вызывает службу gRPC. Это даёт преимущества для разработчиков приложений .NET:
- И службы gRPC, и сопоставленный RESTful JSON API выполняются из одного приложения ASP.NET Core.
- Транскодинг JSON десериализует сообщения JSON в Protobuf и напрямую вызывает службу gRPC. Выполнение этого в процессе даёт значительные преимущества в производительности по сравнению с новым gRPC-вызовом на другой сервер.
Что дальше
Транскодинг JSON в gRPC доступен в .NET 7 Превью 4. Это первый выпуск. Будущие версии .NET 7 будут сосредоточены на повышении производительности и поддержке OpenAPI.
Подробная информация доступна в документации. Также можно посмотреть пример приложения или видео с демонстрацией функционала.
Источник: https://devblogs.microsoft.com/dotnet/announcing-grpc-json-transcoding-for-dotnet/
👍6
День 1220. #Карьера
Повышаем Продуктивность с Помощью Эффекта Зейгарник
Эффект Зейгарник описывает то, как незавершённые задачи остаются активными в нашем уме, вторгаясь в наши мысли и наш сон до тех пор, пока они не будут решены. Как голодный человек замечает каждый ресторан и аппетитный запах по пути домой, а после ужина теряет всякий интерес к еде. Аналогично студенты, зубрящие перед экзаменом, забывают всё, что только что выучили, потому что эта информация больше не нужна.
Эффект назван в честь Блюмы Зейгарник, литовского психолога. Её гипотеза заключалась в том, что люди с большей вероятностью помнят незавершённые задачи, потому что они вызывают у них «психическое напряжение». Состояние напряжения сохраняется, пока остается неудовлетворённой ментальная «потребность в завершении». Но как только задача выполнена, психическое напряжение снимается, и задача может быть стёрта из памяти.
Понимание эффекта Зейгарник и того, как он работает, даёт вам возможность повысить свою продуктивность.
1. Начните хоть с чего-нибудь
Вы знаете, что дедлайн через неделю, поэтому можно отложить дела до обеда. Нет. Просто начните с чего-нибудь. Выделите 20-30 минут. Не нужно начинать со сложного, попробуйте что-нибудь простое. Как только вы приступите к выполнению задачи, какой бы тривиальной она ни была, она поселится в глубине вашего сознания и будет подталкивать вас сделать ещё немного… и ещё немного… пока вы не закончите.
Вы также можете сдвинуть дело с мертвой точки, создав краткий план того, что нужно сделать. Мотивация завершить задачу тем выше, чем яснее мы понимаем, что нужно сделать для её завершения. Это назвали эффектом Хемингуэя, которого спросили: «Сколько вы должны писать в день?» Он ответил: «Лучший способ всегда останавливаться, когда дела идут хорошо и когда вы знаете, что произойдёт дальше. Если вы будете делать это каждый день, пока пишете роман, вы никогда не застрянете».
2. Планируйте тактические перерывы, чтобы лучше запоминать информацию
Люди, которые делают перерывы в работе, чтобы заняться чем-то совершенно другим, как правило, сохраняют концентрацию лучше, чем те, кто пытается втиснуть всё в один присест. Если вы учитесь, распределите обучение на несколько занятий. Вместо того, чтобы пытаться пройти всё это за раз, остановитесь и отстранитесь. Это должно происходить, когда вы «наиболее увлечены». Пока вы пьете кофе или наслаждаетесь прогулкой, вы заметите, что ваш разум продолжает возвращаться к информации, которую вы пытались понять. Перерыв даст вам время подумать о том, что вы узнали, и консолидировать свои мысли, прежде чем возобновить учёбу, оставаясь свежим и сосредоточенным.
3. Ставьте реалистичные цели
Если у вас есть склонность брать сразу много задач, знание того, что навязчивые мысли, как правило, сопровождают незавершённые задачи, должно помочь вам понять, что каждая новая задача, по сути, прерывает то, что вы делали раньше. Это должно побудить вас установить разумные ограничения на количество одновременного выполняемых задач, тем самым повысив продуктивность вашей работы и уменьшив стресс.
4. Завершайте день списком дел
Чрезмерное беспокойство о незавершённых задачах приводит к бессонным ночам. Составьте четкий план того, что вам осталось сделать. Важно, чтобы план был конкретным. Мысль «мне следует заняться спортом» беспокоит подсознание, потому что привлекает внимание к неудовлетворенным целям и оставляет подсознание в неуверенности, как действовать дальше. Мысль «Я пойду на пробежку завтра утром перед работой» позволяет подсознанию точно знать, как действовать дальше, и ему больше не нужно беспокоить сознание навязчивыми мыслями о занятиях спортом. Чтобы отключить мысли о незавершённой работе, посвящайте некоторое время в конце каждого дня обзору достижений за день, и плану, что ещё нужно сделать и как. Ваше подсознание любит, когда план складывается воедино. Хоть как-нибудь.
Источник: https://scitechdaily.com/boost-your-productivity-with-the-zeigarnik-effect/
Повышаем Продуктивность с Помощью Эффекта Зейгарник
Эффект Зейгарник описывает то, как незавершённые задачи остаются активными в нашем уме, вторгаясь в наши мысли и наш сон до тех пор, пока они не будут решены. Как голодный человек замечает каждый ресторан и аппетитный запах по пути домой, а после ужина теряет всякий интерес к еде. Аналогично студенты, зубрящие перед экзаменом, забывают всё, что только что выучили, потому что эта информация больше не нужна.
Эффект назван в честь Блюмы Зейгарник, литовского психолога. Её гипотеза заключалась в том, что люди с большей вероятностью помнят незавершённые задачи, потому что они вызывают у них «психическое напряжение». Состояние напряжения сохраняется, пока остается неудовлетворённой ментальная «потребность в завершении». Но как только задача выполнена, психическое напряжение снимается, и задача может быть стёрта из памяти.
Понимание эффекта Зейгарник и того, как он работает, даёт вам возможность повысить свою продуктивность.
1. Начните хоть с чего-нибудь
Вы знаете, что дедлайн через неделю, поэтому можно отложить дела до обеда. Нет. Просто начните с чего-нибудь. Выделите 20-30 минут. Не нужно начинать со сложного, попробуйте что-нибудь простое. Как только вы приступите к выполнению задачи, какой бы тривиальной она ни была, она поселится в глубине вашего сознания и будет подталкивать вас сделать ещё немного… и ещё немного… пока вы не закончите.
Вы также можете сдвинуть дело с мертвой точки, создав краткий план того, что нужно сделать. Мотивация завершить задачу тем выше, чем яснее мы понимаем, что нужно сделать для её завершения. Это назвали эффектом Хемингуэя, которого спросили: «Сколько вы должны писать в день?» Он ответил: «Лучший способ всегда останавливаться, когда дела идут хорошо и когда вы знаете, что произойдёт дальше. Если вы будете делать это каждый день, пока пишете роман, вы никогда не застрянете».
2. Планируйте тактические перерывы, чтобы лучше запоминать информацию
Люди, которые делают перерывы в работе, чтобы заняться чем-то совершенно другим, как правило, сохраняют концентрацию лучше, чем те, кто пытается втиснуть всё в один присест. Если вы учитесь, распределите обучение на несколько занятий. Вместо того, чтобы пытаться пройти всё это за раз, остановитесь и отстранитесь. Это должно происходить, когда вы «наиболее увлечены». Пока вы пьете кофе или наслаждаетесь прогулкой, вы заметите, что ваш разум продолжает возвращаться к информации, которую вы пытались понять. Перерыв даст вам время подумать о том, что вы узнали, и консолидировать свои мысли, прежде чем возобновить учёбу, оставаясь свежим и сосредоточенным.
3. Ставьте реалистичные цели
Если у вас есть склонность брать сразу много задач, знание того, что навязчивые мысли, как правило, сопровождают незавершённые задачи, должно помочь вам понять, что каждая новая задача, по сути, прерывает то, что вы делали раньше. Это должно побудить вас установить разумные ограничения на количество одновременного выполняемых задач, тем самым повысив продуктивность вашей работы и уменьшив стресс.
4. Завершайте день списком дел
Чрезмерное беспокойство о незавершённых задачах приводит к бессонным ночам. Составьте четкий план того, что вам осталось сделать. Важно, чтобы план был конкретным. Мысль «мне следует заняться спортом» беспокоит подсознание, потому что привлекает внимание к неудовлетворенным целям и оставляет подсознание в неуверенности, как действовать дальше. Мысль «Я пойду на пробежку завтра утром перед работой» позволяет подсознанию точно знать, как действовать дальше, и ему больше не нужно беспокоить сознание навязчивыми мыслями о занятиях спортом. Чтобы отключить мысли о незавершённой работе, посвящайте некоторое время в конце каждого дня обзору достижений за день, и плану, что ещё нужно сделать и как. Ваше подсознание любит, когда план складывается воедино. Хоть как-нибудь.
Источник: https://scitechdaily.com/boost-your-productivity-with-the-zeigarnik-effect/
👍12
День 1221. #ЗаметкиНаПолях
Добавляем Startup.cs в Минимальные API
С минимальными API в .NET 6 просто начать, но по мере роста проекта какие-то части из
Вот пример файла Program.cs с использованием минимальных API:
Соответственно, всё, что идёт до строки
Источник: https://www.c-sharpcorner.com/article/how-to-add-startup-cs-class-in-asp-net-core-6-project/
Добавляем Startup.cs в Минимальные API
С минимальными API в .NET 6 просто начать, но по мере роста проекта какие-то части из
Program.cs
лучше всё-таки вынести. Рассмотрим, как вернуть файл Startup.cs
в проект минимальных API.Вот пример файла Program.cs с использованием минимальных API:
var builder = WebApplication.CreateBuilder(args);Здесь всё написано в одном классе
builder.Services.AddRazorPages();
var app = builder.Build();
if (!app.Environment.IsDevelopment()) {
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Program.cs
. Мы создаём построитель приложения, регистрируем зависимости, строим приложение и добавляем промежуточное ПО.Startup.cs
содержит 2 метода: ConfigureServices()
для регистрации зависимостей и вызова промежуточного ПО в методе Configure()
.Соответственно, всё, что идёт до строки
var app = builder.Build();должно попасть в ConfigureServices. А всё, что после – в Configure.
public class Startup {Теперь нужно вызвать класс Startup из Program.cs:
public IConfiguration configRoot { get; }
public Startup(IConfiguration configuration) {
configRoot = configuration;
}
public void ConfigureServices(IServiceCollection services) {
services.AddRazorPages();
}
public void Configure(WebApplication app, IWebHostEnvironment env) {
if (!app.Environment.IsDevelopment()) {
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
}
}
var builder = WebApplication.CreateBuilder(args);Заметьте, что называть методы именами
var startup = new Startup(builder.Configuration);
startup.ConfigureServices(builder.Services);
var app = builder.Build();
startup.Configure(app, builder.Environment);
ConfigureServices
и Configure
вовсе не обязательно. Тем более, что они похожи и часто путают (особенно новичков). Вы можете задать любые имена.Источник: https://www.c-sharpcorner.com/article/how-to-add-startup-cs-class-in-asp-net-core-6-project/
👍7
День 1222. #ЗаметкиНаПолях #AsyncTips
Блокирующие очереди
Задача
Необходимо создать коммуникационный канал для передачи сообщений или данных между потоками. Например, один поток может загружать данные, которые отправляются по каналу по мере загрузки; другие потоки на стороне получения получают эти данные и обрабатывают их.
Решение
Тип .NET
Блокирующая очередь должна совместно использоваться несколькими потоками, и обычно определяется как приватное поле, доступное только для чтения:
Потоки-производители могут добавлять элементы вызовами Add, а когда поток-производитель завершится (когда будут добавлены все элементы), он может завершить коллекцию вызовом
В следующем простом примере производитель добавляет два элемента, а потом помечает коллекцию как завершенную:
Во всех приведенных примерах
При использовании таких коммуникационных каналов необходимо подумать о том, что произойдет, если производители работают быстрее потребителей. Если элементы производятся быстрее, чем потребляются, возможно, придётся применить регулировку очереди.
Блокирующие очереди хорошо работают при наличии отдельного потока (например, из пула потоков), действующего как производитель или потребитель. Они не настолько хороши, если вы хотите обращаться к коммуникационному каналу асинхронно — например, если UI-поток должен действовать в режиме потребителя. Если вы вводите в своё приложение подобный коммуникационный канал, подумайте о переходе на библиотеку TPL Dataflow. Во многих случаях решение с использованием TPL Dataflow проще самостоятельного построения коммуникационных каналов и фоновых потоков.
Тип
Источник: Стивен Клири “Конкурентность в C#”. 2-е межд. изд. — СПб.: Питер, 2020. Глава 9.
Блокирующие очереди
Задача
Необходимо создать коммуникационный канал для передачи сообщений или данных между потоками. Например, один поток может загружать данные, которые отправляются по каналу по мере загрузки; другие потоки на стороне получения получают эти данные и обрабатывают их.
Решение
Тип .NET
BlockingCollection<T>
проектировался для создания таких коммуникационных каналов. По умолчанию BlockingCollection<T>
работает в режиме блокирующей очереди и предоставляет поведение «первым зашел, первым вышел».Блокирующая очередь должна совместно использоваться несколькими потоками, и обычно определяется как приватное поле, доступное только для чтения:
private readonly BlockingCollection<int> _bq =Обычно поток делает что-то одно: либо добавляет элементы в коллекцию, либо удаляет элементы. Потоки, добавляющие элементы, называются потоками-производителями, а потоки, удаляющие элементы, называются потоками-потребителями.
new BlockingCollection<int>();
Потоки-производители могут добавлять элементы вызовами Add, а когда поток-производитель завершится (когда будут добавлены все элементы), он может завершить коллекцию вызовом
CompleteAdding
. Тем самым он уведомляет коллекцию о том, что элементы далее добавляться не будут, а коллекция может сообщить своим потребителям, что элементов больше не будет.В следующем простом примере производитель добавляет два элемента, а потом помечает коллекцию как завершенную:
_bq.Add(7);Потоки-потребители обычно выполняются в цикле, ожидая следующего элемента и выполняя его последующую обработку. Если выделить код производителя в отдельный поток (например, вызовом
_bq.Add(13);
_bq.CompleteAdding();
Task.Run
), то эти элементы можно будет потреблять следующим образом:// Выводит "7", затем "13".Если потребителей должно быть несколько,
foreach (int item in _bq.GetConsumingEnumerable())
Console.WriteLine(item);
GetConsumingEnumerable
может вызываться из нескольких потоков одновременно. Тем не менее каждый элемент передается только одному из этих потоков. При завершении коллекции завершается и перечисляемый объект.Во всех приведенных примерах
GetConsumingEnumerable
используется для потоков-потребителей; это самая распространённая ситуация. Но существует и метод Take, который позволяет потребителю получить только один элемент (вместо потребления всех элементов в цикле).При использовании таких коммуникационных каналов необходимо подумать о том, что произойдет, если производители работают быстрее потребителей. Если элементы производятся быстрее, чем потребляются, возможно, придётся применить регулировку очереди.
Блокирующие очереди хорошо работают при наличии отдельного потока (например, из пула потоков), действующего как производитель или потребитель. Они не настолько хороши, если вы хотите обращаться к коммуникационному каналу асинхронно — например, если UI-поток должен действовать в режиме потребителя. Если вы вводите в своё приложение подобный коммуникационный канал, подумайте о переходе на библиотеку TPL Dataflow. Во многих случаях решение с использованием TPL Dataflow проще самостоятельного построения коммуникационных каналов и фоновых потоков.
Тип
BufferBlock<T>
из TPL Dataflow может работать как блокирующая очередь, к тому же TPL Dataflow позволяет построить конвейер или сеть для обработки. Впрочем, во многих простых случаях обычные блокирующие очереди (например, BlockingCollection<T>
) станут более подходящим вариантом при проектировании.Источник: Стивен Клири “Конкурентность в C#”. 2-е межд. изд. — СПб.: Питер, 2020. Глава 9.
👍2
День 1223. #МоиИнструменты
VoidTools "Everything"
Сегодня расскажу об очень полезной утилите, которую мне посоветовал коллега.
VoidTools "Everything"
"Everything" — это поисковая система для Windows, которая мгновенно находит файлы и папки по имени. В отличие от поиска Windows, "Everything" при открытии отображает все файлы и папки на вашем компьютере (отсюда и название). Вы вводите фильтр поиска, чтобы отфильтровать отображаемые файлы и папки.
"Everything" легковесный, индексирует только имена файлов и папок, и обычно для создания базы данных требуется несколько секунд. Более того, у утилиты есть панель превью, где вы можете посмотреть содержимое файлов.
Поиск практически мгновенный и невероятно удобный. Например, на картинке ниже я объединил в фильтрах через пробел значения
И ещё парочка «хаков» для улучшения работы.
Смотрим содержимое нестандартных файлов
Хотя "Everything" позволяет посмотреть содержимое множества разных типов файлов, в том числе текстовых, Microsoft Office, картинок, .cs файлов и т.п., некоторые могут не поддерживаться. Например, файлы
Горячая клавиша с использованием клавиши Windows
Можно назначить для нового поиска в "Everything" (да и для чего угодно ещё) горячую клавишу с кнопкой Windows, например,
Зайдите в
Перезагрузите Windows. После этого сочетание Win+S перестанет работать (если что, это глобальный поиск, его также можно открыть по
VoidTools "Everything"
Сегодня расскажу об очень полезной утилите, которую мне посоветовал коллега.
VoidTools "Everything"
"Everything" — это поисковая система для Windows, которая мгновенно находит файлы и папки по имени. В отличие от поиска Windows, "Everything" при открытии отображает все файлы и папки на вашем компьютере (отсюда и название). Вы вводите фильтр поиска, чтобы отфильтровать отображаемые файлы и папки.
"Everything" легковесный, индексирует только имена файлов и папок, и обычно для создания базы данных требуется несколько секунд. Более того, у утилиты есть панель превью, где вы можете посмотреть содержимое файлов.
Поиск практически мгновенный и невероятно удобный. Например, на картинке ниже я объединил в фильтрах через пробел значения
.csproj
и имена папок (начиная с \
), в которых это имя надо искать. Заметьте, что имена папок могут идти в любом порядке. Жирным в результатах подсвечены совпадения. Поиск можно настроить, отфильтровав по типу файла, добавив регулярные выражения и т.п. Отображение результатов также можно изменить.И ещё парочка «хаков» для улучшения работы.
Смотрим содержимое нестандартных файлов
Хотя "Everything" позволяет посмотреть содержимое множества разных типов файлов, в том числе текстовых, Microsoft Office, картинок, .cs файлов и т.п., некоторые могут не поддерживаться. Например, файлы
.csproj
, как показано на картинке ниже. Чтобы это исправить, нужно внести небольшое изменение в реестр. Создайте файл <имя>.reg
и добавьте в него следующее содержимое:REGEDIT4Сохраните файл. Затем двойным щелчком на файле внесите изменения в реестр. После этого этот тип файлов можно будет посмотреть в виде текста. Понятно, что это глобальная настройка отображения для Windows. "Everything" просто использует эти значения.
[HKEY_CLASSES_ROOT\.CSPROJ]
"Content Type"="text/plain"
"PerceivedType"="text"
Горячая клавиша с использованием клавиши Windows
Можно назначить для нового поиска в "Everything" (да и для чего угодно ещё) горячую клавишу с кнопкой Windows, например,
Win+S
. Поэтому его можно отключить, добавив значение в реестр. Аналогично предыдущей, это глобальная настройка.Зайдите в
Computer\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced
и добавьте новое значение Expandable String Value с именем DisabledHotKeys
и значением S
.Перезагрузите Windows. После этого сочетание Win+S перестанет работать (если что, это глобальный поиск, его также можно открыть по
Win+Q
). После этого в "Everything" зайдите в Tools > Options > General > Keyboard
и задайте для File | New Search Window значение Win+S
. Некоторые сочетания с клавишей Windows сработают и без изменений в реестре (например, Win+Y
или Win+J
). Однако, возможно, в будущем им в Windows будет назначено какое-нибудь действие, тогда они работать перестанут.👍6
День 1224. #ЗаметкиНаПолях
Несколько Папок для Статических Файлов в ASP.NET Core
Если вам по какой-то причине нужно разделить ваши статические файлы (к примеру, JS/CSS/картинки в одной папке, и файлы, которые могут скачивать пользователи – в другой), наивным – но неправильным - решением будет использовать
StaticFiles на самом деле используют не просто промежуточное ПО для поиска файла, а полагаются на
В документации есть хорошая статья об этом. Если коротко, это сервис, который знает, как находить файлы разными способами. Платформа имеет несколько реализаций, включая
Итак, нам нужен способ использовать оба провайдера сразу. Сначала создадим нужные нам провайдеры (в данном примере два):
Несколько Папок для Статических Файлов в ASP.NET Core
Если вам по какой-то причине нужно разделить ваши статические файлы (к примеру, JS/CSS/картинки в одной папке, и файлы, которые могут скачивать пользователи – в другой), наивным – но неправильным - решением будет использовать
UseStaticFiles
дважды:app.UseStaticFiles();На первый взгляд, это работает. Промежуточное ПО будет искать файлы в обычной папке
app.UseStaticFiles(new StaticFileOptions()
{
// Добавляем ещё папку
FileProvider = new PhysicalFileProvider(
Path.Combine(
builder.Environment.ContentRootPath,
"Docs"
))
});
wwwroot
, а затем в папке Docs
и возвращать их. Проблема возникает, если вы попытаетесь использовать что-нибудь, типа asp-append-version
в представлениях для файлов из Docs
. Версия просто не будет добавляться. Добавление версии в URL зависит от контрольной суммы файла. В этом случае система не может её найти, и этот атрибут просто будет проигнорирован.StaticFiles на самом деле используют не просто промежуточное ПО для поиска файла, а полагаются на
WebRootFileProvider
. Но что такое FileProvider
?В документации есть хорошая статья об этом. Если коротко, это сервис, который знает, как находить файлы разными способами. Платформа имеет несколько реализаций, включая
PhysicalFileProvider
или ManifestEmbeddedFileProvider
. В нашем плохом примере выше используется PhysicalFileProvider
. А на самом деле UseStaticFiles
использует WebRootFileProvider
для поиска статических файлов (и этот провайдер просто ищет в wwwroot
). Таким образом, реальный способ справиться с проблемой — изменить WebRootFileProvider
приложения.Итак, нам нужен способ использовать оба провайдера сразу. Сначала создадим нужные нам провайдеры (в данном примере два):
var webRootProvider =Теперь нам нужен третий тип, который позволит объединить наши провайдеры. Этот провайдер называется
new PhysicalFileProvider(
builder.Environment.WebRootPath
);
var docPathProvider =
new PhysicalFileProvider(
Path.Combine(
builder.Environment.ContentRootPath,
"Docs"
));
CompositeFileProvider
:var compositeProvider =И наконец, заменяем
new CompositeFileProvider(
webRootProvider,
docPathProvider
);
WebRootFileProvider
нашим новым CompositeFileProvider
:app.Environment.WebRootFileProvider = compositeProvider;Источник: https://wildermuth.com/2022/04/25/multiple-directories-for-static-files-in-aspnetcore/
app.UseStaticFiles();
👍10
День 1226. #ЧтоНовенького
Критическое Изменение: Удаление Привязки HTTPS по Умолчанию в Kestrel
Привязка адреса и порта HTTPS по умолчанию удалена в Kestrel в превью версии 6 .NET 7.
Предыдущее поведение
Раньше, если значения для адреса и порта не указывались явно, но был доступен локальный сертификат для разработки, Kestrel по умолчанию привязывался как к https://localhost:5000, так и к https://localhost:5001.
Теперь пользователи должны вручную привязываться к HTTPS и явно указывать адрес и порт одним из следующих вариантов:
- в файле
- в переменной среды
- в аргументе командной строки
- в конфигурации хоста по ключу
- с помощью метода расширения
Привязка HTTP не изменилась.
Описание критического изменения
- Бинарная несовместимость: существующие двоичные файлы могут столкнуться с критическими изменениями в поведении, такими как сбой при загрузке/выполнении или другое поведение во время выполнения.
- Исходный код несовместим: исходный код может столкнуться с критическим изменением поведения при нацеливании на новую среду выполнения/компонент/SDK, например ошибки компиляции или другое поведение во время выполнения.
- Изменение поведения: Существующий код и двоичные файлы могут вести себя по-разному во время выполнения.
Причина изменения
Текущее поведение привязки по умолчанию происходит независимо от настроенной среды и может привести к проблемам на компьютерах разработчиков, когда сертификат ещё не является доверенным (поскольку он самоподписанный). Клиенты часто получают негативный опыт при обращении к конечной точке HTTPS с ненадёжным сертификатом, например, тихий сбой, либо экран с ошибокой о ненадёжном соединении и т. д.
Рекомендованное действие
Если вы не использовали привязку https://localhost:5001 по умолчанию, никаких изменений не требуется. Однако, если вы использовали эту привязку, ознакомьтесь с этим руководством где описано, как вы можете обновить свой сервер, чтобы включить HTTPS.
Источник: https://github.com/aspnet/Announcements/issues/486
Критическое Изменение: Удаление Привязки HTTPS по Умолчанию в Kestrel
Привязка адреса и порта HTTPS по умолчанию удалена в Kestrel в превью версии 6 .NET 7.
Предыдущее поведение
Раньше, если значения для адреса и порта не указывались явно, но был доступен локальный сертификат для разработки, Kestrel по умолчанию привязывался как к https://localhost:5000, так и к https://localhost:5001.
Теперь пользователи должны вручную привязываться к HTTPS и явно указывать адрес и порт одним из следующих вариантов:
- в файле
launchSettings.json
,- в переменной среды
ASPNETCORE_URLS
,- в аргументе командной строки
--urls
,- в конфигурации хоста по ключу
urls
,- с помощью метода расширения
UseUrls
.Привязка HTTP не изменилась.
Описание критического изменения
- Бинарная несовместимость: существующие двоичные файлы могут столкнуться с критическими изменениями в поведении, такими как сбой при загрузке/выполнении или другое поведение во время выполнения.
- Исходный код несовместим: исходный код может столкнуться с критическим изменением поведения при нацеливании на новую среду выполнения/компонент/SDK, например ошибки компиляции или другое поведение во время выполнения.
- Изменение поведения: Существующий код и двоичные файлы могут вести себя по-разному во время выполнения.
Причина изменения
Текущее поведение привязки по умолчанию происходит независимо от настроенной среды и может привести к проблемам на компьютерах разработчиков, когда сертификат ещё не является доверенным (поскольку он самоподписанный). Клиенты часто получают негативный опыт при обращении к конечной точке HTTPS с ненадёжным сертификатом, например, тихий сбой, либо экран с ошибокой о ненадёжном соединении и т. д.
Рекомендованное действие
Если вы не использовали привязку https://localhost:5001 по умолчанию, никаких изменений не требуется. Однако, если вы использовали эту привязку, ознакомьтесь с этим руководством где описано, как вы можете обновить свой сервер, чтобы включить HTTPS.
Источник: https://github.com/aspnet/Announcements/issues/486
👍4
День 1227. #Карьера
Прекратите Прокрастинировать и Займитесь Наконец Своим Проектом
Мы все слышали стандартный совет по продуктивности — нужно «съесть эту лягушку», т.е. сначала решить самые сложные и важные задачи, чтобы не тратить весь день на прокрастинацию. Это легче сказать, чем сделать.
Существует множество эмоционально важных — хотя и контрпродуктивных — причин, по которым мы можем откладывать важный проект: от боязни выглядеть глупо («Я новичок в этом деле и может получиться плохо») до неуверенности в том, как действовать («Нужно сделать тысячу дел, и я не знаю, с чего начать»). Но если что-то действительно нужно сделать, в конце концов придётся это сделать. И большинство из нас понимает, что лучше раньше, чем позже. Вот три метода, которые вы можете попробовать.
1. Начните с лёгкого изменения поведения
Когда цель большая, сложная или долгосрочная, требуется огромное количество мотивации, чтобы продолжать двигаться вперёд. Проект обычно требует много времени и множества шагов (мозговой штурм, POC, модели, реализация, исправления, обратная связь, дополнительные исправления и т. д.). Как же поддерживать мотивацию?
Вместо того, чтобы сосредотачиваться на огромной задаче, создайте «крошечные привычки», настолько незначительные и выполнимые, что от них невозможно отказаться. Начать часто бывает сложно. Но когда вы почистили один зуб, становится намного легче продолжить и почистить все. Цель в том, чтобы в любой деятельности снизить планку и найти способ начать и сделать хоть что-то. После этого можно разрешить себе бросить, но вы уже можете этого не захотеть.
2. Устанавливайте дедлайны
Каждый управленец слышал мантру: «Что можно измерить, то и делается». Это верно как для отслеживания продаж, так и для достижения наших собственных долгосрочных амбиций.
Для любого крупного проекта, будь то открытие нового бизнеса или изучение чего-то нового, если у вас нет даты дедлайна в календаре, проект не будет закончен. Жизнь вмешается, и вы скажете: «Хорошо, отложу на потом». Так создаётся порочный круг. Обязательство должно быть измеримо, если вы надеетесь на успех.
3. Поставьте эксперимент
Мы часто откладываем задачи, потому что подсознательно завышаем их значимость. Если кажется, что мы принимаем серьёзное решение, нас может парализовать: «Если я начну это делать и брошу, я буду выглядеть неудачником, поэтому придётся продолжать это делать постоянно.» Но на самом деле лишь немногие профессиональные решения являются настолько важными, и почти ни одно из них не является бесповоротным. Запуск проекта, например, не требует клятвы кровью, и, хотя это некрасиво, определённо можно бросить новую работу, если вы понимаете, что она вам не подходит.
Ключ к преодолению этого препятствия и началу работы заключается в том, чтобы снизить ставки в собственном сознании, чтобы облегчить себе начало пути. Если мы рассматриваем проект как определяющий момент в нашей жизни, мы, конечно, будем колебаться.
Вместо этого воспринимайте свои действия как эксперимент, потому что это устраняет страх потерпеть неудачу. Неудача расстраивает, т.к. она подразумевает окончательность: вы пытались что-то сделать, но не получилось. А эксперимент, исход которого вы с самого начала понимаете как неопределённый, вряд ли можно назвать неудачным. Вы знаете, что для получения желаемого результата потребуется несколько итераций, и соответственно устанавливаете свои ожидания. Вместо того, чтобы создать блог и вести его всю жизнь, создайте серию из шести постов в течение пары месяцев. Если ваш блог никто не читает или вы понимаете, что вам это не нравится, вы не потерпели неудачу: вы получили опыт, который поможет вам усовершенствовать свой подход, чтобы добиться успеха в будущем. Когда давление снято, гораздо легче мотивировать себя начать.
Итого
Человеку свойственно откладывать неудобные или нежелательные задачи или делать лёгкий выбор в моменте. Но если вы хотите мыслить стратегически и достигать значимых целей, эти три стратегии могут помочь начать и не сбиться с курса.
Источник: https://hbr.org/2022/05/stop-procrastinating-and-tackle-that-big-project
Прекратите Прокрастинировать и Займитесь Наконец Своим Проектом
Мы все слышали стандартный совет по продуктивности — нужно «съесть эту лягушку», т.е. сначала решить самые сложные и важные задачи, чтобы не тратить весь день на прокрастинацию. Это легче сказать, чем сделать.
Существует множество эмоционально важных — хотя и контрпродуктивных — причин, по которым мы можем откладывать важный проект: от боязни выглядеть глупо («Я новичок в этом деле и может получиться плохо») до неуверенности в том, как действовать («Нужно сделать тысячу дел, и я не знаю, с чего начать»). Но если что-то действительно нужно сделать, в конце концов придётся это сделать. И большинство из нас понимает, что лучше раньше, чем позже. Вот три метода, которые вы можете попробовать.
1. Начните с лёгкого изменения поведения
Когда цель большая, сложная или долгосрочная, требуется огромное количество мотивации, чтобы продолжать двигаться вперёд. Проект обычно требует много времени и множества шагов (мозговой штурм, POC, модели, реализация, исправления, обратная связь, дополнительные исправления и т. д.). Как же поддерживать мотивацию?
Вместо того, чтобы сосредотачиваться на огромной задаче, создайте «крошечные привычки», настолько незначительные и выполнимые, что от них невозможно отказаться. Начать часто бывает сложно. Но когда вы почистили один зуб, становится намного легче продолжить и почистить все. Цель в том, чтобы в любой деятельности снизить планку и найти способ начать и сделать хоть что-то. После этого можно разрешить себе бросить, но вы уже можете этого не захотеть.
2. Устанавливайте дедлайны
Каждый управленец слышал мантру: «Что можно измерить, то и делается». Это верно как для отслеживания продаж, так и для достижения наших собственных долгосрочных амбиций.
Для любого крупного проекта, будь то открытие нового бизнеса или изучение чего-то нового, если у вас нет даты дедлайна в календаре, проект не будет закончен. Жизнь вмешается, и вы скажете: «Хорошо, отложу на потом». Так создаётся порочный круг. Обязательство должно быть измеримо, если вы надеетесь на успех.
3. Поставьте эксперимент
Мы часто откладываем задачи, потому что подсознательно завышаем их значимость. Если кажется, что мы принимаем серьёзное решение, нас может парализовать: «Если я начну это делать и брошу, я буду выглядеть неудачником, поэтому придётся продолжать это делать постоянно.» Но на самом деле лишь немногие профессиональные решения являются настолько важными, и почти ни одно из них не является бесповоротным. Запуск проекта, например, не требует клятвы кровью, и, хотя это некрасиво, определённо можно бросить новую работу, если вы понимаете, что она вам не подходит.
Ключ к преодолению этого препятствия и началу работы заключается в том, чтобы снизить ставки в собственном сознании, чтобы облегчить себе начало пути. Если мы рассматриваем проект как определяющий момент в нашей жизни, мы, конечно, будем колебаться.
Вместо этого воспринимайте свои действия как эксперимент, потому что это устраняет страх потерпеть неудачу. Неудача расстраивает, т.к. она подразумевает окончательность: вы пытались что-то сделать, но не получилось. А эксперимент, исход которого вы с самого начала понимаете как неопределённый, вряд ли можно назвать неудачным. Вы знаете, что для получения желаемого результата потребуется несколько итераций, и соответственно устанавливаете свои ожидания. Вместо того, чтобы создать блог и вести его всю жизнь, создайте серию из шести постов в течение пары месяцев. Если ваш блог никто не читает или вы понимаете, что вам это не нравится, вы не потерпели неудачу: вы получили опыт, который поможет вам усовершенствовать свой подход, чтобы добиться успеха в будущем. Когда давление снято, гораздо легче мотивировать себя начать.
Итого
Человеку свойственно откладывать неудобные или нежелательные задачи или делать лёгкий выбор в моменте. Но если вы хотите мыслить стратегически и достигать значимых целей, эти три стратегии могут помочь начать и не сбиться с курса.
Источник: https://hbr.org/2022/05/stop-procrastinating-and-tackle-that-big-project
👍8👎1
День 1228. #ЗаметкиНаПолях
Blazor: Вопросы и Ответы. Начало
Приложения Blazor состоят из многократно используемых компонентов веб-интерфейса, реализованных с использованием C#, HTML и CSS. И клиентский, и серверный код написаны на C#, что позволяет вам совместно использовать код и библиотеки. Бесплатный фреймворк с открытым исходным кодом превратился из веб-ориентированного в многопрофильный, включая мобильную и настольную разработку.
Рокфорд Лотка, главный архитектор ПО в Marimer, а также известный автор книг и контрибутор открытого кода ответил на несколько вопросов по технологии:
1. С момента своего появления как любимого проекта Стива Сандерсона Blazor стал чрезвычайно популярным. В дополнение к тому, что программисты C# могут участвовать в веб-разработке вместо того, чтобы полагаться в основном на традиционный JavaScript, что ещё предлагает Blazor?
Blazor поддерживает запуск вашего кода как на сервере, так и на клиенте через WebAssembly, и вы можете выбрать, какие пользователи или устройства получат тот или иной опыт. Например, вы можете направить пользователей со старыми и менее мощными устройствами на использование Blazor на стороне сервера, а пользователей с современными устройствами — на использование Blazor WebAssembly.
Blazor также включает в себя мощную модель UI-компонентов, основанную на предыдущем опыте из MVC, Web Forms, Windows Forms, WPF и Xamarin. Модель UI-компонентов Blazor позволяет создавать легко поддерживаемые и повторно используемые компоненты для отдельного виджета или даже целого раздела функций приложения. В сочетании с простыми, но мощными возможностями привязки данных, поддерживаемыми Blazor, в результате получается модель UI, предназначенная для создания как корпоративных приложений так и простых веб-страниц.
2. Предлагает ли Blazor преимущества по сравнению с ASP.NET Core MVC или это специальные инструменты для разных типов заданий?
ASP.NET Core MVC — это серверный веб-фреймворк. Для некоторых сценариев приложений серверная модель, которая передает HTML, CSS и JavaScript в браузер, по-прежнему актуальна, особенно для сценариев, в которых важно отображение данных, а взаимодействие с пользователем имеет второстепенное значение.
Для приложений, где интерактивность очень важна, большинство людей предпочитают UI-фреймворки пользовательского интерфейса, такие как Angular, React или Blazor. Все эти инструменты обеспечивают возможность создания богатого пользовательского опыта, хотя ни один из них не так эффективен при отображении необработанных данных, как MVC.
Преимущество Blazor в этом случае заключается в том, что вы можете смешивать функции ASP.NET MVC или Razor Pages вместе с функциями Blazor в одном приложении и с использованием одной и той же среды IDE и языка программирования.
3. Организации обычно объединяют функциональные возможности Blazor Server и Blazor WebAssembly в своей разработке, или вы обнаружили, что один из вариантов более предпочтителен?
По моим наблюдениям, многие организации используют Blazor на стороне сервера, понимая, что, если им нужна масштабируемость, обеспечиваемая Blazor WebAssembly, они могут использовать эту модель в будущем. Чуть меньше организаций создают приложения Blazor WebAssembly с самого начала, и меньшинство создаёт приложения с динамическим переключением между двумя моделями во время выполнения.
Окончание следует…
Источник: https://visualstudiomagazine.com/articles/2022/05/09/qa-blazor-deep-dive.aspx?m=1
Blazor: Вопросы и Ответы. Начало
Приложения Blazor состоят из многократно используемых компонентов веб-интерфейса, реализованных с использованием C#, HTML и CSS. И клиентский, и серверный код написаны на C#, что позволяет вам совместно использовать код и библиотеки. Бесплатный фреймворк с открытым исходным кодом превратился из веб-ориентированного в многопрофильный, включая мобильную и настольную разработку.
Рокфорд Лотка, главный архитектор ПО в Marimer, а также известный автор книг и контрибутор открытого кода ответил на несколько вопросов по технологии:
1. С момента своего появления как любимого проекта Стива Сандерсона Blazor стал чрезвычайно популярным. В дополнение к тому, что программисты C# могут участвовать в веб-разработке вместо того, чтобы полагаться в основном на традиционный JavaScript, что ещё предлагает Blazor?
Blazor поддерживает запуск вашего кода как на сервере, так и на клиенте через WebAssembly, и вы можете выбрать, какие пользователи или устройства получат тот или иной опыт. Например, вы можете направить пользователей со старыми и менее мощными устройствами на использование Blazor на стороне сервера, а пользователей с современными устройствами — на использование Blazor WebAssembly.
Blazor также включает в себя мощную модель UI-компонентов, основанную на предыдущем опыте из MVC, Web Forms, Windows Forms, WPF и Xamarin. Модель UI-компонентов Blazor позволяет создавать легко поддерживаемые и повторно используемые компоненты для отдельного виджета или даже целого раздела функций приложения. В сочетании с простыми, но мощными возможностями привязки данных, поддерживаемыми Blazor, в результате получается модель UI, предназначенная для создания как корпоративных приложений так и простых веб-страниц.
2. Предлагает ли Blazor преимущества по сравнению с ASP.NET Core MVC или это специальные инструменты для разных типов заданий?
ASP.NET Core MVC — это серверный веб-фреймворк. Для некоторых сценариев приложений серверная модель, которая передает HTML, CSS и JavaScript в браузер, по-прежнему актуальна, особенно для сценариев, в которых важно отображение данных, а взаимодействие с пользователем имеет второстепенное значение.
Для приложений, где интерактивность очень важна, большинство людей предпочитают UI-фреймворки пользовательского интерфейса, такие как Angular, React или Blazor. Все эти инструменты обеспечивают возможность создания богатого пользовательского опыта, хотя ни один из них не так эффективен при отображении необработанных данных, как MVC.
Преимущество Blazor в этом случае заключается в том, что вы можете смешивать функции ASP.NET MVC или Razor Pages вместе с функциями Blazor в одном приложении и с использованием одной и той же среды IDE и языка программирования.
3. Организации обычно объединяют функциональные возможности Blazor Server и Blazor WebAssembly в своей разработке, или вы обнаружили, что один из вариантов более предпочтителен?
По моим наблюдениям, многие организации используют Blazor на стороне сервера, понимая, что, если им нужна масштабируемость, обеспечиваемая Blazor WebAssembly, они могут использовать эту модель в будущем. Чуть меньше организаций создают приложения Blazor WebAssembly с самого начала, и меньшинство создаёт приложения с динамическим переключением между двумя моделями во время выполнения.
Окончание следует…
Источник: https://visualstudiomagazine.com/articles/2022/05/09/qa-blazor-deep-dive.aspx?m=1
👍9
День 1229. #ЗаметкиНаПолях
Blazor: Вопросы и Ответы. Окончание
Рокфорд Лотка, главный архитектор ПО в Marimer, а также известный автор книг и контрибутор открытого кода ответил на несколько вопросов по технологии Blazor.
Начало
4. Сначала Blazor WebAssembly был направлен на приложения SPA, затем стал доступен в мобильной и даже настольной разработке. Какие дальнейшие планы?
Сама по себе WebAssembly, вероятно, станет революционной технологией для многих типов приложений, поскольку она работает во всех современных браузерах, а также во всё большем количестве сценариев на стороне сервера и IoT, включая, например, Kubernetes. Возможность писать код на выбранном вами языке, таком как C#, Go, Rust или многих других, и компилировать этот код в WebAssembly, чтобы он мог работать во многих средах, — это чрезвычайно удобно.
Сам Blazor WebAssembly — это инфраструктура UI, ориентированная на использование HTML и CSS, а также вашего кода C# (вместо TypeScript или JavaScript) для создания браузерных приложений. Как и в случае с другими технологиями SPA, Blazor значительно выигрывает от расширения гибридных сценариев на основе браузера для размещения в мобильных и настольных приложениях, а также непосредственно в браузере.
При этом «песочница» браузера остается на месте. Это хорошо, потому что означает, что приложения Blazor WebAssembly можно запускать в вашем браузере или как мобильное или настольное приложение с тем же уровнем безопасности.
С другой стороны, часто наиболее рентабельно создавать мобильные приложения, используя больше собственных технологий, чем технологии на основе браузера. Если вы создаёте ориентированное на потребителя мобильное или настольное приложение, которое является основной точкой соприкосновения с вашим брендом, очевидно, крайне важно, чтобы ваши пользователи получали наилучший возможный опыт, что побуждает большинство организаций создавать нативные приложения для iOS и Android или, возможно, использовать кроссплатформенный инструмент, такой как Xamarin/MAUI или Flutter.
5. Как насчёт производительности? Чем Blazor отличается от альтернативных фреймворков, таких как React и другие?
Говоря о производительности Blazor, необходимо отделить Blazor на стороне сервера от Blazor WebAssembly. Blazor на стороне сервера чрезвычайно эффективен, причем производительность в значительной степени зависит от того, достаточно ли вашего веб-сервера для рабочей нагрузки. Архитектура ПО Blazor на стороне сервера очень похожа на проверенные временем модели, но с современными скоростями интернета и серверным оборудованием.
Blazor WebAssembly или любой UI на основе WebAssembly может быть медленнее, чем UI-фреймворки JavaScript, такие как React. Это связано с тем, что WebAssembly пока не позволяет нативному коду напрямую взаимодействовать с HTML DOM, поэтому взаимодействие с элементами UI должно проходить через оболочку JavaScript. Чистый вычислительный код обычно работает быстрее в WebAssembly, чем в JavaScript, но взаимодействие с UI происходит медленнее.
Это компенсируется тем, что при правильном использовании все эти UI-платформы SPA, включая Blazor WebAssembly, могут создавать первоклассные UI, которые очень удобны в использовании.
6. Какие инновации вы ожидаете в Blazor и поддерживающей его клиентской технологии WebAssembly?
Я с нетерпением жду WebAssembly, поддерживающую многопоточность и позволяющую нативному коду wasm напрямую взаимодействовать с HTML DOM. Я также рад тому, как WebAssembly распространяется за пределы браузера и может стать общим ассемблерным языком для клиентов, серверов, устройств IoT и многого другого.
Blazor готов поддерживать многопоточность, а благодаря тесной интеграции с инфраструктурой MAUI Blazor, вероятно, станет основной технологией для создания приложений, работающих в браузерах, на мобильных устройствах и на настольных компьютерах, основанных в значительной степени на одной и той же кодовой базе C#, HTML и CSS.
Источник: https://visualstudiomagazine.com/articles/2022/05/09/qa-blazor-deep-dive.aspx?m=1
Blazor: Вопросы и Ответы. Окончание
Рокфорд Лотка, главный архитектор ПО в Marimer, а также известный автор книг и контрибутор открытого кода ответил на несколько вопросов по технологии Blazor.
Начало
4. Сначала Blazor WebAssembly был направлен на приложения SPA, затем стал доступен в мобильной и даже настольной разработке. Какие дальнейшие планы?
Сама по себе WebAssembly, вероятно, станет революционной технологией для многих типов приложений, поскольку она работает во всех современных браузерах, а также во всё большем количестве сценариев на стороне сервера и IoT, включая, например, Kubernetes. Возможность писать код на выбранном вами языке, таком как C#, Go, Rust или многих других, и компилировать этот код в WebAssembly, чтобы он мог работать во многих средах, — это чрезвычайно удобно.
Сам Blazor WebAssembly — это инфраструктура UI, ориентированная на использование HTML и CSS, а также вашего кода C# (вместо TypeScript или JavaScript) для создания браузерных приложений. Как и в случае с другими технологиями SPA, Blazor значительно выигрывает от расширения гибридных сценариев на основе браузера для размещения в мобильных и настольных приложениях, а также непосредственно в браузере.
При этом «песочница» браузера остается на месте. Это хорошо, потому что означает, что приложения Blazor WebAssembly можно запускать в вашем браузере или как мобильное или настольное приложение с тем же уровнем безопасности.
С другой стороны, часто наиболее рентабельно создавать мобильные приложения, используя больше собственных технологий, чем технологии на основе браузера. Если вы создаёте ориентированное на потребителя мобильное или настольное приложение, которое является основной точкой соприкосновения с вашим брендом, очевидно, крайне важно, чтобы ваши пользователи получали наилучший возможный опыт, что побуждает большинство организаций создавать нативные приложения для iOS и Android или, возможно, использовать кроссплатформенный инструмент, такой как Xamarin/MAUI или Flutter.
5. Как насчёт производительности? Чем Blazor отличается от альтернативных фреймворков, таких как React и другие?
Говоря о производительности Blazor, необходимо отделить Blazor на стороне сервера от Blazor WebAssembly. Blazor на стороне сервера чрезвычайно эффективен, причем производительность в значительной степени зависит от того, достаточно ли вашего веб-сервера для рабочей нагрузки. Архитектура ПО Blazor на стороне сервера очень похожа на проверенные временем модели, но с современными скоростями интернета и серверным оборудованием.
Blazor WebAssembly или любой UI на основе WebAssembly может быть медленнее, чем UI-фреймворки JavaScript, такие как React. Это связано с тем, что WebAssembly пока не позволяет нативному коду напрямую взаимодействовать с HTML DOM, поэтому взаимодействие с элементами UI должно проходить через оболочку JavaScript. Чистый вычислительный код обычно работает быстрее в WebAssembly, чем в JavaScript, но взаимодействие с UI происходит медленнее.
Это компенсируется тем, что при правильном использовании все эти UI-платформы SPA, включая Blazor WebAssembly, могут создавать первоклассные UI, которые очень удобны в использовании.
6. Какие инновации вы ожидаете в Blazor и поддерживающей его клиентской технологии WebAssembly?
Я с нетерпением жду WebAssembly, поддерживающую многопоточность и позволяющую нативному коду wasm напрямую взаимодействовать с HTML DOM. Я также рад тому, как WebAssembly распространяется за пределы браузера и может стать общим ассемблерным языком для клиентов, серверов, устройств IoT и многого другого.
Blazor готов поддерживать многопоточность, а благодаря тесной интеграции с инфраструктурой MAUI Blazor, вероятно, станет основной технологией для создания приложений, работающих в браузерах, на мобильных устройствах и на настольных компьютерах, основанных в значительной степени на одной и той же кодовой базе C#, HTML и CSS.
Источник: https://visualstudiomagazine.com/articles/2022/05/09/qa-blazor-deep-dive.aspx?m=1
👍5
День 1230. #Юмор #СписокШуток
Большой Список Бородатых Программистских Шуток
Как называется группа программистов?
Сборка
Какой лучший префикс для глобальных переменных?
//
Я люблю мой кофе таким же, какой я люблю мои IDE…
Темным и бесплатным.
Как лучше назвать фронтенд разработчиков?
<div>елоперы
Какой любимый фильм ужасов у программиста?
XORцист
Как вы называете людей, которые пользовались интернетом до того, как он стал крутым?
Httpстеры
Чем занимался Питер Паркер после того, как потерял работу фотографа в Daily Bugle?
Он перешел в веб-разработку.
Коллега: ты занят?
Я: это целиком зависит от того, что ты собираешься мне сказать дальше.
Как пираты общались до Интернета?
По сети пир-ту-пир
Молчи…
Молчи…
Молчи…
Молчи…
«Но это работает на моей машине»
Блин!
Почему среди SQL-разработчиков один из самых высоких показателей разводов?
Потому что у них отношения один-ко-многим.
Как называется группа из восьми ваххабитов?
Ваххабайт
UI – это как шутка.
Если приходится объяснять, он скорее всего не очень хороший.
Новый запрос к базе данных заходит в бар.
А сервер говорит: «Извините, только кэш».
Почему программисты – плохие марафонцы?
Они специализируются на спринтах.
Девушки похожи на доменные имена.
Те, которые вам нравятся, уже заняты.
У меня есть…
У меня есть шутка про документацию, но она ещё не готова.
У меня есть шутка по поводу моего кода, но она работает только на моей машине.
У меня есть анекдот про UDP. Но до вас вряд ли дойдёт.
Как у вас с английским?
Как .NET разработчик назвал свою лодку?
Sea Sharp
Я: забыл } в JSON
Компилятор: YOU SHALL NOT PARSE 🧙♂️
Do British websites use cookies or biscuits?
The plural of regex is regrets.
You know how a hacker escapes the FBI?
\FBI
My team had a debate on what the best looping variable name is.
i won.
Never ask a SQL dev to help you move furniture.
They drop tables.
A GET request was reluctant to go to the party.
It had no body to go with.
Roses are red,
Violets are blue,
Unexpected ‘{‘ on line 32.
Roses are red’);
DROP TABLE rhyme;
You better sanitize your inputs next time
Errors are red,
My screen is blue.
I think I deleted system32
Источник: https://carlanotarobot.iss.onedium.com/ultimate-list-of-programmer-jokes-puns-and-other-funnies-75264f29baa3
Большой Список Бородатых Программистских Шуток
Как называется группа программистов?
Сборка
Какой лучший префикс для глобальных переменных?
//
Я люблю мой кофе таким же, какой я люблю мои IDE…
Темным и бесплатным.
Как лучше назвать фронтенд разработчиков?
<div>елоперы
Какой любимый фильм ужасов у программиста?
XORцист
Как вы называете людей, которые пользовались интернетом до того, как он стал крутым?
Httpстеры
Чем занимался Питер Паркер после того, как потерял работу фотографа в Daily Bugle?
Он перешел в веб-разработку.
Коллега: ты занят?
Я: это целиком зависит от того, что ты собираешься мне сказать дальше.
Как пираты общались до Интернета?
По сети пир-ту-пир
Молчи…
Молчи…
Молчи…
Молчи…
«Но это работает на моей машине»
Блин!
Почему среди SQL-разработчиков один из самых высоких показателей разводов?
Потому что у них отношения один-ко-многим.
Как называется группа из восьми ваххабитов?
Ваххабайт
UI – это как шутка.
Если приходится объяснять, он скорее всего не очень хороший.
Новый запрос к базе данных заходит в бар.
А сервер говорит: «Извините, только кэш».
Почему программисты – плохие марафонцы?
Они специализируются на спринтах.
Девушки похожи на доменные имена.
Те, которые вам нравятся, уже заняты.
У меня есть…
У меня есть шутка про документацию, но она ещё не готова.
У меня есть шутка по поводу моего кода, но она работает только на моей машине.
У меня есть анекдот про UDP. Но до вас вряд ли дойдёт.
Как у вас с английским?
Как .NET разработчик назвал свою лодку?
Sea Sharp
Я: забыл } в JSON
Компилятор: YOU SHALL NOT PARSE 🧙♂️
Do British websites use cookies or biscuits?
The plural of regex is regrets.
You know how a hacker escapes the FBI?
\FBI
My team had a debate on what the best looping variable name is.
i won.
Never ask a SQL dev to help you move furniture.
They drop tables.
A GET request was reluctant to go to the party.
It had no body to go with.
Roses are red,
Violets are blue,
Unexpected ‘{‘ on line 32.
Roses are red’);
DROP TABLE rhyme;
You better sanitize your inputs next time
Errors are red,
My screen is blue.
I think I deleted system32
Источник: https://carlanotarobot.iss.onedium.com/ultimate-list-of-programmer-jokes-puns-and-other-funnies-75264f29baa3
👍37👎2
День 1231. #ЗаметкиНаПолях #AsyncTips
Блокирующие Стеки и Множества
Задача
Требуется коммуникационный канал для передачи сообщений или данных из одного потока в другой, но вы не хотите, чтобы этот канал использовал семантику FIFO.
Решение
Тип .NET BlockingCollection<T> по умолчанию работает как блокирующая очередь, но он также может работать как любая другая коллекция «производитель/потребитель». По сути, это обёртка для потокобезопасной коллекции, реализующей
Таким образом, вы можете создать
Всё, чтобы было сказано о регулировке применительно к блокирующим очередям, также применимо к блокирующим стекам или множествам. Если ваши производители работают быстрее потребителей, и вы хотите ограничить использование памяти блокирующим стеком/очередью, используйте регулировку (о ней в будущих постах).
Здесь для кода-потребителя используется
Подробнее о потокобезопасных коллекциях см. 1, 2, 3
Источник: Стивен Клири “Конкурентность в C#”. 2-е межд. изд. — СПб.: Питер, 2020. Глава 9.
Блокирующие Стеки и Множества
Задача
Требуется коммуникационный канал для передачи сообщений или данных из одного потока в другой, но вы не хотите, чтобы этот канал использовал семантику FIFO.
Решение
Тип .NET BlockingCollection<T> по умолчанию работает как блокирующая очередь, но он также может работать как любая другая коллекция «производитель/потребитель». По сути, это обёртка для потокобезопасной коллекции, реализующей
IProducerConsumerCollection<T>
.Таким образом, вы можете создать
BlockingCollection<T>
с семантикой LIFO или семантикой неупорядоченного множества:var blockStack = new BlockingCollection<int>(Важно учитывать, что с упорядочением элементов связаны некоторые условия гонки. Если код-производитель отработает до любого кода-потребителя, порядок элементов будет таким же, как у стека:
new ConcurrentStack<int>());
var blockBag = new BlockingCollection<int>(
new ConcurrentBag<int>());
// Код-производительЕсли код-производитель и код-потребитель выполняются в разных потоках (как это обычно бывает), потребитель всегда получает следующим тот элемент, который был добавлен последним. Например, производитель добавляет
blockStack.Add(7);
blockStack.Add(13);
blockStack.CompleteAdding();
// Код-потребитель
// Выводит "13", затем "7".
foreach (int item in blockStack.GetConsumingEnumerable())
Console.WriteLine(item);
7
, потребитель получает 7
, затем производитель добавляет 13
, потребитель получает 13
. Потребитель не ожидает вызова CompleteAdding
перед тем, как вернуть первый элемент.Всё, чтобы было сказано о регулировке применительно к блокирующим очередям, также применимо к блокирующим стекам или множествам. Если ваши производители работают быстрее потребителей, и вы хотите ограничить использование памяти блокирующим стеком/очередью, используйте регулировку (о ней в будущих постах).
Здесь для кода-потребителя используется
GetConsumingEnumerable
. Это самый распространённый сценарий. Также существует метод Take
, который позволяет потребителю получить только один элемент (вместо потребления всех элементов).Подробнее о потокобезопасных коллекциях см. 1, 2, 3
Источник: Стивен Клири “Конкурентность в C#”. 2-е межд. изд. — СПб.: Питер, 2020. Глава 9.
👍7
День 1232. #МоиИнструменты
DataGrip
Мы в нашем чате частенько шутим на тему Visual Studio или Rider. В принципе, здесь предпочтения делятся почти поровну, и каждый пользуется тем, что ему больше нравится. Но вот относительно этого инструмента от JetBrains я должен сказать, что не видел ничего, даже близко похожего по функционалу!
Речь идёт об IDE DataGrip, предназначенной для работы с базами данных.
Вот в этом видео краткое (на 40 минут) описание того, что может эта IDE, и, я вам должен сказать, что 80% моих повседневных задач она намного упростит. Автозаполнение кода, поиск ошибок в запросах (например, отсутствующих объектов, неоднозначно указанных колонок или условий, которые всегда истины), рефакторинг запросов, автоматическое форматирование кода (которое можно экспортировать для создания стиля кодирования в команде). Помимо этого, есть какие-то уж совсем сумасшедшие вещи, типа, визуального сравнения (diff) результатов двух запросов, экспорта выделенных результатов в другую БД или локальной история изменений файлов и папок. Осталось запомнить, что она всё это умеет и применять)))
Есть один минус. 30-дневный триал доступен. А вот дальше, если вы в РФ, могут возникнуть проблемы с покупкой.
DataGrip
Мы в нашем чате частенько шутим на тему Visual Studio или Rider. В принципе, здесь предпочтения делятся почти поровну, и каждый пользуется тем, что ему больше нравится. Но вот относительно этого инструмента от JetBrains я должен сказать, что не видел ничего, даже близко похожего по функционалу!
Речь идёт об IDE DataGrip, предназначенной для работы с базами данных.
Вот в этом видео краткое (на 40 минут) описание того, что может эта IDE, и, я вам должен сказать, что 80% моих повседневных задач она намного упростит. Автозаполнение кода, поиск ошибок в запросах (например, отсутствующих объектов, неоднозначно указанных колонок или условий, которые всегда истины), рефакторинг запросов, автоматическое форматирование кода (которое можно экспортировать для создания стиля кодирования в команде). Помимо этого, есть какие-то уж совсем сумасшедшие вещи, типа, визуального сравнения (diff) результатов двух запросов, экспорта выделенных результатов в другую БД или локальной история изменений файлов и папок. Осталось запомнить, что она всё это умеет и применять)))
Есть один минус. 30-дневный триал доступен. А вот дальше, если вы в РФ, могут возникнуть проблемы с покупкой.
👍8
День 1233. #Курсы
GitHub Skills
GitHub представил GitHub Skills – новую платформу для изучения GitHub.
Независимо от того, насколько хорошо вы знаете GitHub, всегда есть возможность узнать что-то новое. Если вы новичок, вы захотите узнать, как начать работу. Если вы опытный пользователь, хорошо быть в курсе последних обновлений. В прошлом предлагались другие возможности для расширения ваших знаний о GitHub, такие как Learning Lab и обучающие видеоролики, но теперь это можно сделать прямо на самом GitHub.
GitHub Skills основан на GitHub Actions и поможет вам развить новые навыки, а также сделать разработку на GitHub более эффективной. Например, если вы хотите настроить сайт для своего проекта или создать личный блог, вы можете пройти курс «GitHub Pages» и опубликовать свой сайт.
Сейчас доступны курсы по некоторым из самых популярных тем:
Introduction to GitHub
Начните использовать GitHub меньше, чем за час.
Communicate using Markdown
Упорядочивайте идеи и общайтесь с коллегами с помощью Markdown, облегчённого языка форматирования текста.
GitHub Pages
Создайте сайт или блог из своих репозиториев GitHub с помощью GitHub Pages.
Review pull requests
Сотрудничайте и работайте вместе на GitHub.
Resolve merge conflicts
Узнайте, почему возникают конфликты и как их разрешать.
Hello GitHub Actions
Создайте действие GitHub и используйте его в рабочем процессе.
Continuous integration
Создавайте рабочие процессы, позволяющие использовать непрерывную интеграцию (CI) для ваших проектов.
Publish packages
Используйте GitHub Actions, чтобы опубликовать свой проект в образе Docker.
Вы также можете использовать бесплатный шаблон курса с открытым исходным кодом для создания собственных руководств для вашего проекта, команды или компании.
Поскольку GitHub Skills работает на GitHub Actions, пройти курс GitHub Skills можно бесплатно в публичных репозиториях. Если вы хотите использовать GitHub Skills в закрытом репозитории, это бесплатно, пока вы не израсходуете ежемесячные бесплатные минуты GitHub Actions в своей учетной записи.
В связи с переходом на GitHub Skills, Learning Lab прекратит работу 1 сентября 2022 года.
Источник: https://github.blog/2022-06-06-introducing-github-skills/
GitHub Skills
GitHub представил GitHub Skills – новую платформу для изучения GitHub.
Независимо от того, насколько хорошо вы знаете GitHub, всегда есть возможность узнать что-то новое. Если вы новичок, вы захотите узнать, как начать работу. Если вы опытный пользователь, хорошо быть в курсе последних обновлений. В прошлом предлагались другие возможности для расширения ваших знаний о GitHub, такие как Learning Lab и обучающие видеоролики, но теперь это можно сделать прямо на самом GitHub.
GitHub Skills основан на GitHub Actions и поможет вам развить новые навыки, а также сделать разработку на GitHub более эффективной. Например, если вы хотите настроить сайт для своего проекта или создать личный блог, вы можете пройти курс «GitHub Pages» и опубликовать свой сайт.
Сейчас доступны курсы по некоторым из самых популярных тем:
Introduction to GitHub
Начните использовать GitHub меньше, чем за час.
Communicate using Markdown
Упорядочивайте идеи и общайтесь с коллегами с помощью Markdown, облегчённого языка форматирования текста.
GitHub Pages
Создайте сайт или блог из своих репозиториев GitHub с помощью GitHub Pages.
Review pull requests
Сотрудничайте и работайте вместе на GitHub.
Resolve merge conflicts
Узнайте, почему возникают конфликты и как их разрешать.
Hello GitHub Actions
Создайте действие GitHub и используйте его в рабочем процессе.
Continuous integration
Создавайте рабочие процессы, позволяющие использовать непрерывную интеграцию (CI) для ваших проектов.
Publish packages
Используйте GitHub Actions, чтобы опубликовать свой проект в образе Docker.
Вы также можете использовать бесплатный шаблон курса с открытым исходным кодом для создания собственных руководств для вашего проекта, команды или компании.
Поскольку GitHub Skills работает на GitHub Actions, пройти курс GitHub Skills можно бесплатно в публичных репозиториях. Если вы хотите использовать GitHub Skills в закрытом репозитории, это бесплатно, пока вы не израсходуете ежемесячные бесплатные минуты GitHub Actions в своей учетной записи.
В связи с переходом на GitHub Skills, Learning Lab прекратит работу 1 сентября 2022 года.
Источник: https://github.blog/2022-06-06-introducing-github-skills/
👍8
День 1234. #ЧтоНовенького
Новый Профилировщик Ввода-Вывода в Visual Studio
В Visual Studio 17.2 появился новый профилировщик, который поможет вам понять, как оптимизировать операции файлового ввода-вывода для повышения производительности ваших приложений. Если вы пытаетесь исследовать и диагностировать медленное время загрузки, новый инструмент File IO может помочь понять, на какие операции ввода-вывода тратится много времени.
- Нажмите
- Установите флажок рядом с инструментом File IO и любыми другими инструментами, которые могут вам понадобиться.
- Нажмите Start, чтобы запустить профилирование.
После запуска выполните сценарий, который вы хотите профилировать в своём приложении. Затем нажмите «Stop collection» или закройте приложение, чтобы увидеть результаты.
Просмотр результатов
Инструмент File IO предоставляет информацию о чтении и записи файлов во время сеанса профилирования, и может помочь вам диагностировать проблемы с производительностью, такие как неэффективный код чтения или записи данных. Файлы автоматически генерируются в отчёт после сбора статистики.
Если вы щелкните правой кнопкой мыши на строку с именем файла, вы можете перейти к соответствующему месту в вашем исходном коде. Если строка содержит агрегированную информацию о нескольких чтениях/записях, её можно развернуть, чтобы увидеть отдельные операции.
Коэффициент дублирования
Столбец DuplicationFactor может помочь вам принять решение о том, где вы можете сократить время чтения или обработки. Коэффициент дублирования показывает, читаете/записываете ли вы в файл больше, чем это нужно. Если он равен 3, это значит, что количество прочитанных из файла байт в 3 раза превышает размер самого файла, что может указывать на то, что вы читаете и обрабатываете больше, чем того хотите. Это может указать на место, где кэширование результата чтения файла может улучшить производительность приложения.
Просмотр трассировок
Двойной щелчок по любому файлу приведёт загрузке представления Backtraces, которое позволит вам увидеть, где в вашем коде происходит чтение или запись.
Источник: https://devblogs.microsoft.com/visualstudio/new-profiler-feature-in-visual-studio/
Новый Профилировщик Ввода-Вывода в Visual Studio
В Visual Studio 17.2 появился новый профилировщик, который поможет вам понять, как оптимизировать операции файлового ввода-вывода для повышения производительности ваших приложений. Если вы пытаетесь исследовать и диагностировать медленное время загрузки, новый инструмент File IO может помочь понять, на какие операции ввода-вывода тратится много времени.
- Нажмите
Alt+F2
, чтобы открыть профилировщик производительности в Visual Studio.- Установите флажок рядом с инструментом File IO и любыми другими инструментами, которые могут вам понадобиться.
- Нажмите Start, чтобы запустить профилирование.
После запуска выполните сценарий, который вы хотите профилировать в своём приложении. Затем нажмите «Stop collection» или закройте приложение, чтобы увидеть результаты.
Просмотр результатов
Инструмент File IO предоставляет информацию о чтении и записи файлов во время сеанса профилирования, и может помочь вам диагностировать проблемы с производительностью, такие как неэффективный код чтения или записи данных. Файлы автоматически генерируются в отчёт после сбора статистики.
Если вы щелкните правой кнопкой мыши на строку с именем файла, вы можете перейти к соответствующему месту в вашем исходном коде. Если строка содержит агрегированную информацию о нескольких чтениях/записях, её можно развернуть, чтобы увидеть отдельные операции.
Коэффициент дублирования
Столбец DuplicationFactor может помочь вам принять решение о том, где вы можете сократить время чтения или обработки. Коэффициент дублирования показывает, читаете/записываете ли вы в файл больше, чем это нужно. Если он равен 3, это значит, что количество прочитанных из файла байт в 3 раза превышает размер самого файла, что может указывать на то, что вы читаете и обрабатываете больше, чем того хотите. Это может указать на место, где кэширование результата чтения файла может улучшить производительность приложения.
Просмотр трассировок
Двойной щелчок по любому файлу приведёт загрузке представления Backtraces, которое позволит вам увидеть, где в вашем коде происходит чтение или запись.
Источник: https://devblogs.microsoft.com/visualstudio/new-profiler-feature-in-visual-studio/
👍9