using System;
using System.IO;
class Program {
static void Main() {
System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;
throw new Exception("СМЭРТЬ");
}
static void UnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e) {
File.WriteAllText("UnhandlerError.log", e.ExceptionObject.ToString());
Environment.Exit(1);
}
}
var array = new[] { "Картоновый человек", "Морковка белая", "секретный специалист " };
Console.WriteLine(FindIndexOfWord(array, "картоновый")); // 0
Console.WriteLine(FindIndexOfWord(array, "Бомбастер")); // -1
Console.WriteLine(FindIndexOfWord(array, "Специалист")); // 2
// В 1 проход. Если не нравится linq - можно одной кнопкой переписать на циклы и получится почти zero-allocation код.
static int FindIndexOfWord(string[] array, string word) =>
array
.Select((str, i) => (str.Split(' '), i))
.Where(x => x.Item1.Any(w => w.Equals(word, StringComparison.OrdinalIgnoreCase)))
.Select(x => x.Item2)
.Cast<int?>()
.FirstOrDefault() ?? -1;
var array = new[] { "Картоновый человек", "Морковка белая", "секретный специалист " };
var index = new WordIndex(array);
Console.WriteLine(index.Find("картоновый")); //0
Console.WriteLine(index.Find("чикибамбони")); //-1;
// Поиск элемента в словаре по ключу выполняется за константное время, так что если нужно делать это часто и на больших массивах, то выгоднее 1 раз всё проиндексировать.
class WordIndex {
private readonly Dictionary<string, int> _cache;
public WordIndex(IEnumerable<string> seq) {
_cache = new Dictionary<string, int>();
var i = 0;
foreach(var str in seq) {
foreach(var word in str.Split(' ')) {
var key = word.ToUpperInvariant();
if(!_cache.ContainsKey(key)) {
_cache.Add(key, i);
}
}
i++;
}
}
public int Find(string word) =>
_cache.TryGetValue(word.ToUpperInvariant(), out var value)
? value
: -1;
}
http://localhost:5000/api/Rtb/Param?ids=1&ids=2
P.S. Если удалить первое действие, то все выполняется как надо
Можно ли автоматизировать процесс?
systemctl ... restart
Можно ли как-то в visual studio сделать чтобы перед публикацией она подключилась по SHH, вошла под root, остановила сервис, опубликовала файлы и вновь запустила сервис?
И дополнительный вопрос, как сделать чтобы остановка сервиса не нарушила работу приложения?
Или если сервис остановится в процессе выполнение участка коды, который нельзя прерывать
using System;
using System.IO;
using System.Linq;
var command = args[0];
if (command == "split")
{
// Чтобы разбить файл, нужно передать команду split ./path/to/file/test
// В итоге в текущей папке появится папка result с чанками по 2кб, которые будут называться, как оригинальный файл, но с номером на конце.
// например ./result/test1
// ./result/test2 итд
var filePath = args[1];
const int chunkSize = 2 * 1024; // 2 KB
await using var src = File.OpenRead(filePath);
var fileName = Path.GetFileName(filePath);
var chunkNo = 0;
var buffer = new Memory<byte>(new byte[1024]); // 1 KB buffer
Directory.CreateDirectory("result");
var bytesInChunkWritten = 0;
var currentChunk = File.OpenWrite(Path.Combine(Directory.GetCurrentDirectory(), "result", fileName + chunkNo));
while (true)
{
var bytesRead = await src.ReadAsync(buffer);
await currentChunk.WriteAsync(buffer[..bytesRead]);
if (bytesRead < buffer.Length)
break;
bytesInChunkWritten += bytesRead;
if (bytesInChunkWritten >= chunkSize)
{
await currentChunk.DisposeAsync();
chunkNo += 1;
currentChunk = File.OpenWrite(Path.Combine(Directory.GetCurrentDirectory(), "result", fileName + chunkNo));
bytesInChunkWritten = 0;
}
}
}
else if (command == "merge")
{
// Чтобы склеить файлы - нужно передать команду merge с путём к папке со всеми чанками и оригинальным названием файла
// Например если оригинальный файл назывался test, то нужно дать команду merge ./result/test
// В итоге в папке ./result появится оригнальный файл test
var filePath = Path.GetFullPath(args[1]);
var dir = Path.GetDirectoryName(filePath);
var fileName = Path.GetFileName(filePath);
// Сортируем все чанки в правильном порядке
var chunks = Directory.GetFiles(dir!, fileName + "*")
.Where(x => x.Length > filePath.Length)
.OrderBy(x => int.Parse(x[filePath.Length..]));
// Создаём файл
var dest = File.OpenWrite(Path.Combine(dir, fileName));
// Перекладываем всё в него
foreach (var chunk in chunks)
{
await using var file = File.OpenRead(chunk);
await file.CopyToAsync(dest);
}
}
Размером от 700 до 2000
var text = @"pr_fp=ea4b83cce35fe5dc744ef485372f1cdeec8862e546fc4ce353e309b5a88351d9
wasm=b1a91e0252cc91a33cb489f2f0ca5b06
rcid=111a5116-d8cd-405d-9c74-7776cba81515
";
var dict = text
.Split(new []{'\n', '\r'}, StringSplitOptions.RemoveEmptyEntries)
.Select(x=>x.Split('=', 2))
.ToDictionary(x=>x[0], x=>x[1]);
var wasm = dict["wasm"];
Console.WriteLine(wasm); //b1a91e0252cc91a33cb489f2f0ca5b06
Configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables()
.Build();
public Startup(IConfiguration configuration) =>
Configuration = configuration;
public IConfiguration Configuration { get; }
Configuration.Get<AppSettings>();
А если в коде контроллера нет вызова асинхронных методов, будет ли какая-то разница?
Или может быть имеет смысл этот код без асинхронных вызовов обернуть в таск и авейтить его, сделав метод контроллера асинхронным?
Do not:
- Block asynchronous execution by calling Task.Wait or Task.Result.
- Acquire locks in common code paths. ASP.NET Core apps are most performant when architected to run code in parallel.
- Call Task.Run and immediately await it. ASP.NET Core already runs app code on normal Thread Pool threads, so calling Task.Run only results in extra unnecessary Thread Pool scheduling. Even if the scheduled code would block a thread, Task.Run does not prevent that.
double x1;
Console.Write("Введите x1: ");
if(!double.TryParse(Console.ReadLine(), out x1)) {
do {
Console.WriteLine("неправильный ввод");
Console.Write("введите x1: ");
} while(!double.TryParse(Console.ReadLine(), out x1));
}
var msg = x.Compare(x1) switch {
-1 => $"{x} < {x1}",
0 => $"{x} = {x1}",
+1 => $"{x} > {x1}"
};
Console.WriteLine(msg);