Ответы пользователя по тегу .NET
  • В чём отличие многопоточности и асинхронности в контексте .NET C#?

    @none7
    Разница в том, что многопоточность это вытесняющая многозадачность, а async это кооперативная. А блокируймость и неблокируймость это из религии JS пришло, где потоков нет вообще. У обоих подходов есть как свои плюсы, так и свои минусы.
    Ответ написан
    Комментировать
  • Как правильно сравнивать ENUM на C#?

    @none7
    FileAttributes не является Enum в привычном смысле. Это битовая маска, то есть число в котором определенные биты имеют определенные значения. Пример откровенно говоря неправильный, так как в ожидаемые директории будет иметь ещё и атрибут Directory, как минимум. Если нужно найти все файлы имеющие один из атрибутов, то код должен выглядеть так
    if(dir.Attributes & (FileAttributes.Hidden | FileAttributes.Offline) != 0)

    Здесь мы складываем биты двух атрибутов и если любой из них не будет равен 0, то условие сработает.
    Ответ написан
    3 комментария
  • Имеет ли смысл использовать асинхронные вызовы в консольных программах Don net core, если алгоритм обработки последователен?

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

    @none7
    Свойства проекта
    Target = "Any CPU"
    Prefer 32-bit = false
    vs2015_proppage_build.png?view=vs-2019

    А вообще хорошим тоном является запуск браузера по умолчанию указывая вместо пути к программе сам URL и установив свойство UseShellExecute=true. Если хочется предоставить выбор браузера, то нужно залезть в HKEY_CLASSES_ROOT и вытащить из него список обработчиков.
    Ответ написан
    Комментировать
  • Как добавить многопоточность в этот код?

    @none7
    Создаёшь функцию c yield return для перечисления всех чисел. Создаёшь Semaphore(30, 30). Затем перебирая эти числа foreach блокируешь семафор(один из 30 слотов) и запускаешь таски, которые по завершению семафор освобождают. Но нужно не забыть, что, выход из foreach не означает завершение всех задач, а так же не стоит забывать про синхронизацию.
    Как то так:
    spoiler

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            string key = "";
            char StartChar = '1';
            bool lifeWork = false;
            int line = 0, success = 0;
            private void button1_Click(object sender, EventArgs e)
            {
                key = textBox1.Text;
                StartChar = Convert.ToChar(textBox1.Text.Substring(0, 1));
                timerLog.Interval = 100;
                timerLog.Enabled = true;
                lifeWork = true;
                _ = Work();
            }
    
            IEnumerable<long> GetWorks(string key)
            {
                long value = EncodeBase36(key);
    
                while (true)
                {
                    long newValue = value - 1;
                    if (StartChar != Convert.ToChar(DecodeBase36(newValue).Substring(0, 1)))
                    {
                        break;
                    }
                    yield return newValue;
                    value = newValue;
                }
            }
            private async Task Work()
            {
                var set = new HashSet<Task>();
                var jobsSim = new SemaphoreSlim(30, 30);
                var lockSim = new SemaphoreSlim(1, 1);
    
                foreach(var value in GetWorks(key))
                {
                    if (!lifeWork) break;
    
                    // ограничиваем число потоков
                    // по большей части лимит нужен, чтобы не зафлудить сервер запросами
                    await jobsSim.WaitAsync();
                    Task task = GetResponce(DecodeBase36(value));
                    await lockSim.WaitAsync();
                    set.Add(task);
                    lockSim.Release();
                    _ = task.ContinueWith(async(t) => {
                        await lockSim.WaitAsync();
                        success++;
                        set.Remove(t);
                        lockSim.Release();
                        jobsSim.Release();
                    });
                    line++;
                }
    
                await lockSim.WaitAsync();
                var tasks = set.ToList();
                lockSim.Release();
    
                await Task.WhenAll(tasks);
    
                MessageBox.Show("Off work");
            }
            private async Task GetResponce(string value)
            {
                // Тут будет происходить гет запрос и прочая работа с строкой . По времени занимает от 5 до 15 секунд.
                // Так что код сделла чисто для симуляции времени работы .
                Random rnd = new Random();
                int timeOutn = rnd.Next(5, 15);
                await Task.Delay(timeOutn * 1000);
            }
            public static long EncodeBase36(string number, int radix = 36)
            {
                const string Digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
                if (radix < 2 || radix > Digits.Length)
                    throw new ArgumentException("The radix must be >= 2 and <= " +
                        Digits.Length.ToString());
    
                if (String.IsNullOrEmpty(number))
                    return 0;
    
                // Make sure the arbitrary numeral system number is in upper case
                number = number.ToUpperInvariant();
    
                long result = 0;
                long multiplier = 1;
                for (int i = number.Length - 1; i >= 0; i--)
                {
                    char c = number[i];
                    if (i == 0 && c == '-')
                    {
                        // This is the negative sign symbol
                        result = -result;
                        break;
                    }
    
                    int digit = Digits.IndexOf(c);
                    if (digit == -1)
                        throw new ArgumentException(
                            "Invalid character in the arbitrary numeral system number",
                            "number");
    
                    result += digit * multiplier;
                    multiplier *= radix;
                }
    
                return result;
            }
    
            private void timerLog_Tick(object sender, EventArgs e)
            {
                lbLine.Text = line.ToString();
                lbSuccess.Text = success.ToString();
            }
    
            public static string DecodeBase36(long decimalNumber, int radix = 36)
            {
                const int BitsInLong = 64;
                const string Digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
                if (radix < 2 || radix > Digits.Length)
                    throw new ArgumentException("The radix must be >= 2 and <= " +
                        Digits.Length.ToString());
    
                if (decimalNumber == 0)
                    return "0";
    
                int index = BitsInLong - 1;
                long currentNumber = Math.Abs(decimalNumber);
                char[] charArray = new char[BitsInLong];
    
                while (currentNumber != 0)
                {
                    int remainder = (int)(currentNumber % radix);
                    charArray[index--] = Digits[remainder];
                    currentNumber = currentNumber / radix;
                }
    
                string result = new String(charArray, index + 1, BitsInLong - index - 1);
                if (decimalNumber < 0)
                {
                    result = "-" + result;
                }
    
                return result;
            }
        }
    }

    Ответ написан
    Комментировать
  • Где же все-таки находится ссылка на таблицу методов в .NET?

    @none7
    Когда не знаешь чему верить, то верь отладчику.
    Там так:
    static void test(object o) {
        Type t = o->type; // offset 0
        IntPtr *vt = t->vtable_of_type; // offset 0x28 на x86
        vt[3](); // call
    }
    Ответ написан
    Комментировать
  • При переводе из одной системы счисления выскакивает true, как исправить c++ crl?

    @none7
    textBox4->Text = System::Convert::ToString(chislo);// тут какой из этих методов должен по Вашему вызываться? Странно, что оно вообще компилируется.
    Ответ написан
    Комментировать
  • Как ускорить работу стека построенного на массиве размером 100М элементов?

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

    @none7
    Код самого цикла с точки зрения ilspy выглядит так:
    for (int i = 0; i < bytes.Length; i += 2)
        bytes[i] = (byte)((int)bytes[i] ^ 168 - i);

    но по моему так:
    for (int i = 0; i < bytes.Length; i += 2)
        bytes[i] = (byte)((i - 168) ^ bytes[i]);

    Но выше цикла вообще ересь. Метод System.Console::WriteLine(string) требует 1 аргумент, а System.Text.Encoding::GetBytes(string) требует ещё и объект для которого будет вызван метод. И где же тогда соответствующие ldarg,ldloc ? Запустить этот кусок IL-кода мне также не удалось. Выплёвывает исключение System.InvalidProgramException, может быть этот кусок просто обманка, а реальный в обработчике исключения? Также вполне возможно, что данное приложение полиморф и этот код на самом деле будет переписан во время работы.
    Ответ написан
    1 комментарий
  • Паттерн Dispose от MS?

    @none7
    Если речь о небольшом буфере, то смысла действительно не много. Но если речь о нескольких десятках мегабайт памяти, то ОС свапать начнёт раньше, чем запустит полную сборку мусора. Да и придумывался этот паттерн в первую очередь для блокирующих ресурсов. Таких как файлы, открытые порты, дескрипторы окон, потоки и т.д.
    Ответ написан
    Комментировать