nina4ever Ответов: 2

Существует ли эквивалент класса executorservice java в C#?


Дорогой,
Существует ли эквивалент класса ExecutorService Java в C#?

Следующий код Java создает пул потоков фиксированного размера и циклически перебирает список файлов. В цикле исполнитель выполняет рабочий процесс для обработки файла (рабочий вызывает веб-службу).

ExecutorService executor = Executors.newFixedThreadPool(poolSize);

for (int n=0; n < files.length; n++) 
{
    final File myFile = files[n];
    Runnable worker = new MyWorker(myFile);
    executor.execute(worker);
}

try 
{
    executor.shutdown();

    while (!executor.isTerminated()) { }     
} 
finally 
{
    executor.shutdownNow();
}


Как я знаю, в этом коде, поскольку размер пула равен (poolSize), он начнет работать над заданиями (poolSize), а другие задания будут находиться в состоянии ожидания, как только одно из заданий будет завершено, другое задание из очереди ожидания будет подхвачено рабочим потоком и выполнено get. Это объясняется ЗДЕСЬ

Мне нужна такая же функциональность в C#

Что я уже пробовал:

Эта статья: Несколько способов ограничения обработки параллельных задач кажется, он объясняет, как это сделать несколькими способами, но это не так прямо и просто, как реализация Java.
Существует ли прямая реализация функциональности ExecutorService на языке C#? или мне следует попробовать более длинные коды, предоставленные предыдущая ссылка?

Я не очень хорошо разбираюсь в резьбе, поэтому любая помощь будет оценена по достоинству. Заранее спасибо

Afzaal Ahmad Zeeshan

Почему вы не можете использовать простые нити? Или используйте пул потоков для управления этими запущенными операциями.

nina4ever

не могли бы вы дать мне ссылку на пример использования ThreadPool фиксированного размера ? и будет ли он автоматически управлять задачами в очереди ?

2 Ответов

Рейтинг:
17

RickZeeland

Microsoft рекомендует использовать задачи, есть такая настройка MaxDegreeOfParallelism.
Смотрите пример здесь: многопоточность - пул потоков задач C# - запуск 100 задач только в 10 потоках - переполнение стека[^]


nina4ever

спасибо. я попробую это сделать и дам обратную связь

Рейтинг:
12

nina4ever

Благодаря RickZeeland Это простой рабочий пример . :

private async void button1_Click(object sender, EventArgs e)
{
    await WriteThem();
    Console.WriteLine("FINISHED ALL in button click");
}

public async Task Write(string s)
{
    for ( int i=0;  i <= 3; i++)
        Console.WriteLine(s.ToUpper() +" - "+ i.ToString().PadLeft(2, '0'));
    await Task.Delay(100);
    Console.WriteLine($"finished {s}");

}
public async Task WriteThem()
{
    Console.WriteLine("started WriteThem");
    await Task.Delay(1000);

    var block = new ActionBlock<string>( async  _ => { await Write(_); } ,
        new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 2 });

    List<string> names = new List<string>();
    names.Add("task 01");
    names.Add("task 02");
    names.Add("task 03");
    names.Add("task 04");

    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();

    try
    {
        foreach (string s in names)
        {
            block.Post(s);
        }

        block.Complete();
        await block.Completion;

        stopwatch.Stop();
        Console.WriteLine("FINISHED in WriteThem: " + stopwatch.Elapsed);

    }
    catch (Exception n)
    {
        Console.WriteLine(n.Message);
    }

}