Пользователь пока ничего не рассказал о себе

Достижения

Все достижения (3)

Наибольший вклад в теги

Все теги (22)

Лучшие ответы пользователя

Все ответы (75)
  • Как убрать полный путь до файлов проекта .NET Core в исключениях?

    @basrach
    Эта информация хранится в файлах с расширением *.pdb. Они нужны для дебагера. Удалить часть пути из них невозможно, но можно удалить файл целиком и тогда в исключениях не будет информации об исходном коде вообще, будет только стек вызовов (имя класса, название метода и т.п.). Также можно в .csproj добавить условие, чтобы при релизном билде эти файлы не создавались:
    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
      <DebugType>none</DebugType>
      <DebugSymbols>false</DebugSymbols>
    </PropertyGroup>

    В основном эти файлы нужны для дебага. Без них дебаггер не будет корректно работать, т.е. он не сможет сопоставить в общем случае инструкцию с исходным кодом. Соотвественно не в релизе отключать генерацию этих файлов не стоит.
    Ответ написан
    Комментировать
  • Как ограничить количество одновременно запускаемых потоков?

    @basrach
    Самый простой вариант это использовать Parallel.Foreach.
    var myEntities = new MyEntity[100];
    var maxThreads = 15;
    
    System.Threading.Tasks.Parallel.ForEach(
        myEntities,
        new System.Threading.Tasks.ParallelOptions { MaxDegreeOfParallelism = maxThreads },
        entity =>
        {
            entity.Do()
        });


    Второй вариант использовать Semaphore или SemaphoreSlim.
    var myEntities = new MyEntity[100];
    var maxThreads = 15;	
    
    var semaphoreSlim = new SemaphoreSlim(maxThreads);
    var tasks = new List<Task>(myEntities.Length);
    foreach (var entity in myEntities)
    {
    	tasks.Add(Task.Run(() =>
    	{
    		semaphoreSlim.Wait();
    		try
    		{
    			entity.Do();
    		}
    		finally
    		{
    			semaphoreSlim.Release();	
    		}
    	}));
    }
    
    Task.WaitAll(tasks.ToArray());


    Если вы хотите использовать класс Thread напрямую, то
    var myEntities = new MyEntity[100];
    var maxThreads = 3;	
    
    var semaphore = new Semaphore(maxThreads, maxThreads);
    var threads = new List<Thread>(myEntities.Length);
    foreach (var entity in myEntities)
    {
    	var thread = new Thread(() =>
    	{
    		semaphore.WaitOne();
    		try
    		{
    			entity.Do();
    		}
    		finally
    		{
    			semaphore.Release();
    		}
    	});
    	
    	threads.Add(thread);
    	
    	thread.Start();
    }
    
    foreach (var thread in threads)
    	thread.Join();


    Хотя из условий задачи кажется, что здесь вполне можно обойтись Task. Task предпочтительней еще и по той причине, что потоки переиспользуются. Т.е. задействованных потоков будет столько, сколько одновременно выполняется задач, например 15. В случае же создания потока напрямую через класс Thread, 15 будут работать, остальные просто ждать, при этом все равно расходуя ресурсы.
    Ответ написан
    Комментировать
  • Нарушаю ли я ООП используя partial классы?

    @basrach
    Нет.
    Partail классы это механизм компилятора. А ООП стиль написания программ. Понятия из разных областей и не пересекаются никак.
    Ответ написан
    Комментировать
  • Как сделать задержку с интервалом?

    @basrach
    Красиво будет сделать вот так:
    1) Установить пакет System.Reactive
    2) Дописать:

    ...
    private Subject<int> myHotkey = new Subject<int>();
    
    public MainForm()
    {
        ...
    
        myHotkey
            .AsObservable()
            .Throttle(TimeSpan.FromSeconds(1))
            .Subscribe(hotkeyid => MessageBox.Show("Нажата горячая клавиша с ID:  " + hotkeyid));
    }
    
    ...
    
    protected override void WndProc(ref Message keyPressed)
    {
        ...
                switch (keyPressed.WParam.ToInt32())
                {
                    case 1: 
                    {
                        SetPrtSc(); 
                        myHotkey.OnNext(keyPressed.WParam.ToInt32());
                    }
                    break;
    ...
    Ответ написан
    Комментировать
  • Какими сервисами/программами перевести часовой аудиофайл в (русскоязычный) текст?

    @basrach
    Биржа труда фрилансеров - единственный сервис который тут на самом деле может помочь.
    Ответ написан
    Комментировать