Я написал службу 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();
}
}
}