【发布时间】:2019-12-06 10:45:16
【问题描述】:
我正在使用控制台 EXE,我必须不断下载特定数据,对其进行处理并将其结果保存在 MSSQL DB 中。
我推荐Never ending Task 用于创建单个任务,它适用于我的一种方法。 我有 3 个方法可以同时执行,所以我创建了 3 个我想连续并行执行的任务,所以这里对代码进行了一些更改是我的代码
CancellationTokenSource _cts = new CancellationTokenSource();
var parallelTask = new List<Task>
{
new Task(
() =>
{
while (!_cts.Token.WaitHandle.WaitOne(ExecutionLoopDelayMs))
{
DataCallBack(); // method 1
ExecutionCore(_cts.Token);
}
_cts.Token.ThrowIfCancellationRequested();
},
_cts.Token,
TaskCreationOptions.DenyChildAttach | TaskCreationOptions.LongRunning),
new Task(
() =>
{
while (!_cts.Token.WaitHandle.WaitOne(ExecutionLoopDelayMs))
{
EventCallBack(); // method 2
ExecutionCore(_cts.Token);
}
_cts.Token.ThrowIfCancellationRequested();
},
_cts.Token,
TaskCreationOptions.DenyChildAttach | TaskCreationOptions.LongRunning),
new Task(
() =>
{
while (!_cts.Token.WaitHandle.WaitOne(ExecutionLoopDelayMs))
{
LogCallBack(); //method 3
ExecutionCore(_cts.Token);
}
_cts.Token.ThrowIfCancellationRequested();
},
_cts.Token,
TaskCreationOptions.DenyChildAttach | TaskCreationOptions.LongRunning)
};
Parallel.ForEach(parallelTask, task =>
{
task.Start();
task.ContinueWith(x =>
{
Trace.TraceError(x.Exception.InnerException.Message);
Logger.Logs("Error: " + x.Exception.InnerException.Message);
Console.WriteLine("Error: " + x.Exception.InnerException.Message);
}, TaskContinuationOptions.OnlyOnFaulted);
});
Console.ReadLine();
我想并行执行方法 1、方法 2 和方法 3。但是当我测试它时只有method3正在执行
我搜索了替代方案,但没有找到合适的指导。有没有合适的有效方法。
【问题讨论】:
-
这篇文章是否能给您一些解决问题的见解:stackoverflow.com/questions/12343081/…
-
我不想让这些任务休眠,加上它无休止的调用意味着在输入数据出现问题之前它不会停止。当我只创建一个任务并运行它时,我发布的代码工作正常。但是当创建 3 并将其称为并行时,只有最后一个正在执行
-
你不应该在任务中睡觉。一个更好的解决方案是用于异步编程的 task.delay。
-
@wes,好的,我也试试!
-
您可能从链接的问题中选择了最差的答案。我认为最好的是this。
标签: c# multithreading console-application task-parallel-library multitasking