Это пользовательский C# TaskScheduler с независимым пулом потоков.
Используется независимый пул потоков, в котором потоки разделены на основные и вспомогательные. Вспомогательные потоки динамически увеличиваются и освобождаются, а общее количество потоков не превышает параметра _maxThreadCount.
Бесшовная совместимость с Task. Может использоваться для асинхронного выполнения, как альтернатива BackgroundWorker.
Задачи, ожидающие выполнения в очереди, могут быть отменены.
Группировка задач реализуется через расширение класса TaskHelper.
По сравнению с SmartThreadPool, преимущество заключается в бесшовной совместимости с классом Task. Использование аналогично классу Task, поскольку это расширение для Task и TaskScheduler. Поддерживаются методы ContinueWith, WaitAll и совместимость с async и await для асинхронной разработки.
Объём кода значительно сокращён: класс TaskSchedulerEx содержит более 260 строк кода.
Количество потоков в пуле автоматически увеличивается или уменьшается в зависимости от нагрузки. Реализован простой подход для оптимизации производительности, но без интеллектуальных функций, подобных 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 )