1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/s0611163-TaskSchedulerEx

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

TaskSchedulerEx

Это пользовательский C# TaskScheduler с независимым пулом потоков.

Особенности

  1. Используется независимый пул потоков, в котором потоки разделены на основные и вспомогательные. Вспомогательные потоки динамически увеличиваются и освобождаются, а общее количество потоков не превышает параметра _maxThreadCount.

  2. Бесшовная совместимость с Task. Может использоваться для асинхронного выполнения, как альтернатива BackgroundWorker.

  3. Задачи, ожидающие выполнения в очереди, могут быть отменены.

  4. Группировка задач реализуется через расширение класса TaskHelper.

  5. По сравнению с SmartThreadPool, преимущество заключается в бесшовной совместимости с классом Task. Использование аналогично классу Task, поскольку это расширение для Task и TaskScheduler. Поддерживаются методы ContinueWith, WaitAll и совместимость с async и await для асинхронной разработки.

  6. Объём кода значительно сокращён: класс TaskSchedulerEx содержит более 260 строк кода.

  7. Количество потоков в пуле автоматически увеличивается или уменьшается в зависимости от нагрузки. Реализован простой подход для оптимизации производительности, но без интеллектуальных функций, подобных SmartThreadPool. Для повышения эффективности предлагается идея расчёта оптимального количества потоков на основе среднего времени выполнения каждой задачи и использования формулы (количество потоков = количество ядер процессора * (время локального вычисления + время ожидания) / время локального вычисления). Затем динамическое создание потоков на основе оптимального числа, хотя этот процесс может повлиять на производительность.

Пример использования

using System;
using System.Windows.Forms;
using Utils;

/**
 * TaskSchedulerEx 使用示例
 */

namespace TaskSchedulerExTest
{
    public partial class Form1 : Form
    {
        private TaskSchedulerEx _taskEx = new TaskSchedulerEx(20, 20);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (_taskEx != null)
            {
                _taskEx.Dispose(); //释放资源
            }
        }

        #region Log
        private void Log(string log)
        {
            if (!this.IsDisposed)
            {
                if (this.InvokeRequired)
                {
                    this.BeginInvoke(new Action(() =>
                    {
                        textBox1.AppendText(DateTime.Now.ToString("HH:mm:ss.fff") + " " + log + "\r\n\r\n");
                    }));
                }
                else
                {
                    textBox1.AppendText(DateTime.Now.ToString("HH:mm:ss.fff") + " " + log + "\r\n\r\n");
                }
            }
        }
        #endregion

        //基本用法
        private void button1_Click(object sender, EventArgs e)
        {
            _taskEx.Run(() =>
            {
                Log("简单测试");
            });
        }

        //传递参数
        private void button2_Click(object sender, EventArgs e)
        {
            _taskEx.Run((obj) =>
            {
                Log("输入的参数是:" + obj ?? obj.ToString());
            }, "参数1");
        }

        //异步用法
        private async void button3_Click(object sender, EventArgs e)
        {
            for (int i = 1; i <= 10; i++)
            {
                await _taskEx.Run((obj) =>
                {
                    int k = (int)obj;
                    Log("异步测试,i=" + k);
                }, i);
            }
        }

        //返回值测试
        private async void button4_Click(object sender, EventArgs e)
        {
            string result = await _taskEx.Run<string>(() =>
            {
                return "返回值测试";
            });
            Log(result);
        }
    }
}

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Один пользовательский TaskScheduler на C#, независимый пул потоков. Развернуть Свернуть
C#
MIT
Отмена

Обновления (3)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/s0611163-TaskSchedulerEx.git
git@api.gitlife.ru:oschina-mirror/s0611163-TaskSchedulerEx.git
oschina-mirror
s0611163-TaskSchedulerEx
s0611163-TaskSchedulerEx
main