[c#] Как переписать многопоточное приложение в асинхронное?

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

Вопрос: что нужно изменить чтобы переписать программу с использованием асинхронности (async/await) ?

ниже упрощенный код приложения.
using System;
using System.Threading;
namespace testthread;

class WorkClass {
    int Data;
    readonly ManualResetEvent _mainExitEvent;
    readonly ManualResetEvent _workEndedEvent;
    public WorkClass(int data, ManualResetEvent mainExitEvent, ManualResetEvent workEndedEvent) {
        Data = data;
        _mainExitEvent = mainExitEvent;
        _workEndedEvent = workEndedEvent;
    }
    public void ThreadProc() {
        Console.WriteLine($"thread {Data} started");
        var r = new Random();
        do {
            Thread.Sleep(2000); // очень важная работа          
        }
        while (!_mainExitEvent.WaitOne(r.Next(2000)));
        Console.WriteLine($"thread {Data} stopped");
        _workEndedEvent.Set(); // событие того, что работа зкончена
    }
}

public class Program { 
    public static void Main(string[] args) {
        ManualResetEvent mainExitEvent = new(false);
        const int THREAD_COUNT = 10;
        ManualResetEvent [] workEndEvents = new ManualResetEvent[THREAD_COUNT];
        for (int i = 0; i < THREAD_COUNT; i++) {
            workEndEvents[i] = new ManualResetEvent(false);
            WorkClass work = new WorkClass(i, mainExitEvent, workEndEvents[i]);
            Thread workThread = new Thread(new ThreadStart(work.ThreadProc));
            workThread.Start();
        }
        Thread.Sleep(10);
        Console.WriteLine("press any key to exit from main thread");

        // tcpListener.Start();
        // modbus_network.ListenAsync();

        Console.ReadKey();  // по какому-то условию заканчиваем работу
        Console.WriteLine("trying to exit:");
        mainExitEvent.Set();
        Thread.Sleep(10);
        WaitHandle.WaitAll(workEndEvents);
        Console.WriteLine("All exited!");
    }
}


Про асинхронность читал, но не понимаю, как и чем она поможет тут.
  • Вопрос задан
  • 98 просмотров
Решения вопроса 1
@rPman
не понятна цель перевода универсального кода на основе потоков к асинхронному коду, чья нормальная работа допускается с кучей оговорок.
может лучше оставить как есть?

По коду видно что в внутри потока реализован свой event loop, это хорошо, значит работа уже разделена на кусочки
таким образом тебе осталось эти кусочки важной работы раскидать на события (т.е. к примеру вызов каждого нового кусочка - новое событие, значит нужно сформулировать условие создание следующего события, например если это просто 'вычисления' то по очереди создаешь события для куска работы от каждого потока, чтобы они по очереди выполнялись)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы