我有一些任务要长时间运行。我想启动任务,然后在循环中检查它们是否仍在运行,如果其中一个被取消或以其他方式停止,则重新启动任务。我拥有的代码无法检测到任务已启动,而是要一遍又一遍地重新启动它们。有人可以帮我吗?还是有一种更好的方式来做我想要的?谢谢。
public async Task TaskBx(CancellationToken ct)
{
while (true)
{
//Do stuff
await Task.Delay(500);
}
}
public async Task TaskAx(CancellationToken ct)
{
while (true)
{
//Do stuff
await Task.Delay(500);
}
}
private async Task StartTrade(CancellationToken ct)
{
Task TA = Task.Factory.StartNew(() => TaskAx(ct));
Task TB = Task.Factory.StartNew(() => TaskBx(ct));
while (true)
{
if ((TA != null) && (TA.IsCompleted == true)) { _ = Task.Factory.StartNew(() => TaskAx(ct)); Console.WriteLine("Start TaskA"); } else { Console.WriteLine("Started A"); }
if ((TB != null) && (TB.IsCompleted == true)) { _ = Task.Factory.StartNew(() => TaskBx(ct)); Console.WriteLine("Start TaskB"); } else { Console.WriteLine("Started B"); }
await Task.Delay(50);
}
}
您没有将TA
和TB
重新分配给新的Task
实例。此外,您不会处置旧实例,这是一个坏主意。最后,无需调用Task.Factory.StartNew()
。
类似的方法可能会更好,我确实更改了您的延迟并添加了更多输出以更好地了解正在发生的事情...
static void Main(string[] args)
{
var token = new CancellationToken();
var mainTask = StartTrade(token);
while (true)
{
if (Console.ReadKey().Key == ConsoleKey.Escape)
{
break;
}
}
}
public async static Task TaskBx(CancellationToken ct)
{
Console.WriteLine("Enter TaskBx");
while (true)
{
if (ct.IsCancellationRequested)
break;
//Do stuff
await Task.Delay(1000);
break; // For demonstration.
}
Console.WriteLine("Exit TaskBx");
}
public async static Task TaskAx(CancellationToken ct)
{
Console.WriteLine("Enter TaskAx");
while (true)
{
if (ct.IsCancellationRequested)
break;
//Do stuff
await Task.Delay(2000);
break; // For demonstration.
}
Console.WriteLine("Exit TaskAx");
}
private async static Task StartTrade(CancellationToken ct)
{
Task TA = TaskAx(ct);
Task TB = TaskBx(ct);
while (true)
{
if (ct.IsCancellationRequested)
break;
if ((TA != null) && (TA.IsCompleted == true))
{
TA.Dispose();
TA = null;
TA = TaskAx(ct);
Console.WriteLine("Start TaskA");
}
else
{
Console.WriteLine("Started A");
}
if ((TB != null) && (TB.IsCompleted == true))
{
TB.Dispose();
TB = null;
TB = TaskBx(ct);
Console.WriteLine("Start TaskB");
}
else
{
Console.WriteLine("Started B");
}
await Task.Delay(500);
}
}