C # список задач: возможно ли вызвать одну и ту же функцию с другим индексом задачи? - PullRequest
0 голосов
/ 14 сентября 2018

Я написал службу windows c # для чтения информации с устройств Ethernet; при запуске метода я запускаю новую задачу, которая вызывает класс. Внутри этого класса я создаю список задач. Тогда на него будут ссылаться многие задачи, так же как и количество устройств, найденных в сети.

Используя общедоступную функцию Main(), запустите ту же функцию mainTask с другим индексом задачи.

Возможно ли это сделать или я допустил ошибку?

// ===========================================================
// Windows service code
// ===========================================================

protected override void OnStart(string[] args)
{
    this.task = Task.Factory.StartNew(() => mainTask(token), token);   
    Date.Main refMainClass = new Main();
}

protected override void OnStop()
{
    this.tokenSource.Cancel();                

    try
    {
        this.task.Wait();
    }
    catch (Exception ex)
    {
        //Log exception ....
    }
}

private void mainTask(CancellationToken token)
{
    MyClass.Main refMainClass = new Main();

    if (token.IsCancellationRequested)
    {
        //Cleaning activities before exiting...                 
        refMainClass .stopTasks();

        try
        {
            refMainClass.waitTasks();
        }
        catch (Exception ex)
        {
            //Log some exception ...
        }
        System.Threading.Thread.Sleep(5000);                
    }
}

// ===========================================================
// Class code
// ===========================================================

публичный класс Main {

List<Task> tasks = null;
List<CancellationToken> cancellationTokens = null;
List<CancellationTokenSource> cancellationTokenSources = null;

public Main()
{
    int deviceIndex = 1;

    foreach (var device in myDevices)
    {
        this.cancellationTokenSources[deviceIndex] = new CancellationTokenSource();
        this.cancellationTokens[deviceIndex] = new CancellationToken();
        this.cancellationTokens[deviceIndex] = this.cancellationTokenSources[deviceIndex].Token;

    // ======================================================================
    // Is possible calling many times the same function "mainTask" with different 
    // task numbers. The tasks are stored in the TASK LIST??
    // ======================================================================

    this.tasks[deviceIndex] = Task.Factory.StartNew(() => mainTask(cancellationTokens[deviceIndex], deviceIndex));

        deviceIndex++;
    }
}

private void mainTask(CancellationToken token, int deviceIndex)
{
    // Some code

    if (token.IsCancellationRequested)
    {
        //Cleaning activities before exiting...                  
        // ...
        System.Threading.Thread.Sleep(5000);
    }
}

public void stopTasks()
{
    foreach (var cancellationToken in this.cancellationTokenSources)
    {
        cancellationToken.Cancel();
    }
}

public void waitTasks()
{
    foreach (var task in this.tasks)
    {
        task.Wait();
    }
}

}

...