Ответы пользователя по тегу C#
  • Асинхронный UDP-клиент на C#. Где происходит получение данных?

    @none7
    Там ниже код
    Task.Run(() =>
                {
                    IPEndPoint ipEndPoint = null;
    
                    while (true)
                    {
                        try
                        {
                            var receivedBytes = _client.Receive(ref ipEndPoint);
                            TaskCompletionSource<byte[]> tcs;
                            if (_tcsDictionary.TryGetValue(ipEndPoint, out tcs)) tcs.SetResult(receivedBytes);
                        }
                        catch (SocketException)
                        {
                            ;//при невозможности соединения продолжаем работать
                        }
    
                    }
                });

    Здесь при помощи tcs.SetResult данные передаются в первый кусок кода.
    Ответ написан
    1 комментарий
  • В чём принцип работы STUN?

    @none7
    STUN нужен, чтобы узнать свой внешний ip и, что важнее внешний порт ассоциированный с внутренним. Ещё STUN сервер нужен, чтобы выяснить тип NAT. Если у одного из Вас Symmetric, а у другого RestrictedCone или PortRestrictedCone, то можно забыть про P2P. Больше STUN не на что не годен. В случае VoIP, клиенты желающие соединиться обмениваются через SIP адресами полученными через STUN и направляют на друг друга поток трафика. В случае restricted NAT передача должна начаться с обеих сторон иначе NAT принимающей стороны решит, что пакеты нужно отбросить. Teredo например начинает слать пакеты пустышки, получение которых символизирует, что соединение уже установлено. Вы можете написать собственный Teredo клиент по спецификации, она довольно простая.
    STUN такой куций протокол потому, что он лишь дополнение для SIP. Но это не мешает использовать его для своих нужд.
    Ответ написан
    Комментировать
  • Как запустить C# DLL библиотеку под office для х86 и х64?

    @none7
    У меня были устаревшие сведения. Так, что в комментарии я наврал. Regasm которым Вы пользуетесь он 32-битный и все его записи попадают в WOW64 в том числе и записи в реестр. Используйте консоль для сборки x64, чтобы regasm писал в правильную ветвь реестра. Чтобы корректно установить библиотеку Вам понадобится вызвать 2 разных regasm!
    Ответ написан
    Комментировать
  • Передаю не правильный заголовок в POST запрос (C#)?

    @none7
    Не можете форматировать json руками, используйте классы
    JsonSerializer.Serialize(new { input = "We make the world a better place" , lang = "ja"})
    Ответ написан
    7 комментариев
  • Почему в веб-приложении, на странице, выводиться 8, а не 4?

    @none7
    Это связано с тем, что анонимный метод вызывается дважды. Один раз для логов, второй для отправке клиенту. Не записывайте в переменные родительского метода ничего.
    Ответ написан
  • Как организовать доступ двух потоков к общей переменной в C#?

    @none7
    В данном конкретном случае, нет. Переменная str это указатель, с точки зрения процессора это примитивный тип данных. Самое страшное, что могло бы произойти это мешанина битов в переменной, но процессор сам разруливает такие ситуации с примитивными типами. Со структурами тот же трюк не пройдёт.
    Ответ написан
    Комментировать
  • Что из себя представляют объекты примитивных значимых, ссылочных типов?

    @none7
    Все свойства ValueType открыты, у базовых типов вроде int, свойств вообще нет, они прибиты к ValueType для красоты. Они хранилище для чисел, просто набор битов, примитивнее просто некуда, с ними работают машинные инструкции, а не методы. В случае локальных переменных они вполне могут существовать лишь в регистрах процессора или вообще стереться за ненадобностью. Это и есть разница между age и _age, другой разницы нет. Что касается методов, то как код фреймворка должен вызывать скрытые методы? Не существует такой вещи.
    Какого рода дескрипторы? Гуглёжь находит дескрипторы файлов и окон...
    P.S. Сложные книги предполагают, что Вы имеет базовое понимание работы компьютера и понимаете Си.
    Ответ написан
  • При запуске приложения или при сохранении выдает ошибку, что "недостаточно памяти для продолжения выполнения программы"?

    @none7
    Диспетчер задач врёт, у Вас ещё меньше памяти. Свопа осталось 62 мб, то есть если программа под распаковку картинки просит больше, то случится фейл, а языки с gc память резервируют крупными блоками. Картинки жрут чуть больше чем 4 байта на пиксель, гифки тоже для каждого кадра, тут уж сами считайте сколько это памяти. Что делать? Правильный вариант раскошелится на память, цена вопроса на али около 1500р. Неправильный, затянуть пояс потуже. Увеличить своп, перейти на 32-битную винду, грохнуть дискорд и другие прожорливые приложения и ненужные службы. В крайнем случае кодить в легковесном редакторе, а отлаживать по старинке, выводом информации в лог.
    Ответ написан
    4 комментария
  • Как в C# подключить свою библиотеку dll при работе из консоли?

    @none7
    shared1.cs
    public class MyShared {
        public static string getHello() => "Hello, World";
    }
    prog.cs
    class MyProgram {
    	static void Main(string[] args) => System.Console.WriteLine(MyShared.getHello());
    }

    csc /t:library shared1.cs
    csc /t:exe /r:shared1.dll prog.cs
    Ответ написан
    Комментировать
  • Как воспроизвести на сайте скаченное/записанное видео с сервера (НЕ трансляция с IP-camera)?

    @none7
    videoSource: SafeUrl;
    videoData: ???;
    Ответ написан
    Комментировать
  • C# передать параметр в Win32Api функцию?

    @none7
    Во первых эти массивы должны размещаться в самой структуре, а не управляемые ссылки на них. Странно уже то, что маршалинг исключение не выплюнул. Должно быть как то так:
    struct SET_DISK_ATTRIBUTES
    {
        public uint Version;
        public bool Persist;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public byte[] Reserved1;
        public ulong Attributes;
        public ulong AttributesMask;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public uint[] Reserved2;
    };

    Во вторых Вы забыли скопировать структуру в память и передаете функции DeviceIoControl не инициализированный мусор. Так же можно добавить перегруженный метод DeviceIoControl принимающий ref SET_DISK_ATTRIBUTES вместо IntPtr и не возится с динамической памятью. Пока структура является локальной переменной синхронного метода, GC её никуда не утащит.
    Ответ написан
    Комментировать
  • Как узнать количество оперативной памяти которое используется в данный момент и общий объем RAM?

    @none7
    Вероятно это возможно только через WinAPI и то не факт, что стандартный SDK тут поможет. Пример получения этих данных на Си. perfdata.c
    Ответ написан
    Комментировать
  • Как исправить System.IO.EndOfStreamException: "Чтение после конца потока невозможно." в MemoryStream?

    @none7
    while(reader.Position != reader.Length) // должно работать

    Для ReadString() возврат пустой строки, вполне вменяемое поведение.

    Например, если бы считывался этот комментарий, то Ваш код не дошёл бы до этой строчки.
    Ответ написан
    4 комментария
  • Зачем нужен Async Await в C#?

    @none7
    Изначально async/await появились как способ изничтожить лаги окошек при I/O операциях. Раньше для этого требовалось создавать поток или возится с колбеками асинхронных функций и запускать Form.Invoke для доступа к форме. Асинхронные же обработчики событий не вешают основной поток и всегда выполняются в потоке формы.

    Когда код встречает await, то немедленно возвращает поток в ThreadPool. Это позволяет параллельно обрабатывать множество задач нуждающихся в I/O, ограниченным числом потоков. Большое число потоков может выжрать всю виртуальную память, что не есть хорошо. Но есть и жирные минусы, lock не работает, скорость выполнения кода ниже.
    Ответ написан
    Комментировать
  • Семантика типов в Си и C#?

    @none7
    Не совсем. Ссылка не может указывать чёрт знает куда, только на объект соответствующего типа или быть нулём(null). Добавочно ссылочный тип всегда проверяется на не равенство нулю при вызове из него метода. То есть внутри метода this == null всегда ложно. В С# есть и обычные указатели, но только в небезопасном режиме.
    Ответ написан
    Комментировать
  • Превышение объёма памяти в C#?

    @none7
    Если выводить в файл это единственное, что нужно делать с данными, то лучше генерировать их по необходимости. Так памяти много не понадобиться.
    public static IEnumerable<string> GetNumbersRange (int numberLength, int start, int end)
    {
        string format = "D" + numberLength;
        for (int i = start; i < end; i++)
            yield return i.ToString(format);
    }
    
    public static IEnumerable<string> GetOperatorNumbers(IEnumerable<string> operators, IEnumerable<string> numbers, int countryCode)
    {
        string Country = "";
        if (countryCode > 0)
        {
            Country = DATA.Code[countryCode].ToString();
        }
    
        foreach (var op in operators)
            foreach (var num in numbers)
                yield return Country + op + num;
    }
    
    File.AppendAllLines("file.txt", GetOperatorNumbers(...));
    Ответ написан
    2 комментария
  • Как убрать лишние символы при декодировании Gmail письма из Base64Url?

    @none7
    и из-за чего они появляются?

    Content-Transfer-Encoding: quoted-printable

    Как убрать / заменить на правильные эти символы

    Encoding.ASCII.GetBytes(s);
    paste.org.ru/?4bdcz7
    Encoding.UTF8.GetString(bytes);
    Но правильней, скормить парсеру MIME.
    Ответ написан
    Комментировать
  • Как ускорить работу стека построенного на массиве размером 100М элементов?

    @none7
    Это невозможно! В тесте метод inc выполняется 108 раз. В среднем считывая по 2 * 108 байт данных за 1 проход. Даже если этот массив будет считать видеокарта GT 970, она сможет переварить чуть больше 1000 вызовов inc в секунду в среднем. В условие секунды можно вписаться если только переписать тест и класс и свести все 555 + 555 + 555 + 555 + ... в один 555 * n.
    Ответ написан
    5 комментариев
  • Почему данный код блокирует UI?

    @none7
    А дело точно не в строчке tbLeft.Text = content; ? Обычные TextBox плохо переваривали большие объёмы текста. И эта строчка точно будет блокировать UI.
    Ответ написан
    1 комментарий
  • Анонимные типы в c# и их особенности?

    @none7
    Этот автор только сильно запутал Вас. Код:
    var instance = new {Name = "Alex", Age = 27}
    Эквивалентен такому коду:
    class Anonymous0001 // ссылочный тип
    {
        public string Name { get; private set; } // из других классов выглядит как read-only свойство
        public int Age { get; private set; }
        public Anonymous0001(string name, int age)
        {
            Name = name;
            Age = age;
        }
    }
    
    class Program
    {
        static void Main()
        {
            var instance = new Anonymous0001("Alex", 27);
        }
    }

    Если будет другая строка new { ... }, то компилятор сгенерирует ещё один класс. Всю остальную ересь просто забудьте. В анонимный тип нельзя добавить какую либо функциональность и от них нет никакого толку. Созданы лишь как часть синтаксического сахара, для упрощения выборки нескольких значений из linq запросов. Вроде такого:
    var a = new System.Collections.Generic.Dictionary<string, int>() { { "vasya", 0 }, { "kolya", 0 }, { "alex", 1} };
    
    int i = 0;
    var result = from item in a where item.Value == 0
        select new { Index = i++, Name = item.Key, Id = item.Value }; // создание объекта анонимного типа
    
    foreach(var res in result) {
        bool first = true;
        foreach (var prop in res.GetType().GetProperties()) {
            if (first) first = false;
            else Console.Write(", ");
            Console.Write("{0} = {1}", prop.Name, prop.GetValue(res, null));
        }
        Console.WriteLine();
    }
    Ответ написан
    Комментировать