我正在尝试并行(多线程)运行多个任务,但是测试显示它们仍在并发运行。下面的代码似乎与我在SO上阅读的其他示例以及MS文档相似,可能只是我遗漏或不了解的内容。
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText =
"call checking(utl_raw.cast_to_varchar2(hextoraw(:in_data)), :return_cde)";
cmd.Parameters.Add("in_data",
OracleDbType.Varchar2,
5000,
"000102030405060708090A0B0C0D",
ParameterDirection.Input);
cmd.Parameters.Add("return_cde",
OracleDbType.Varchar2,
8,
"OK",
ParameterDirection.InputOutput);
cmd.ExecuteNonQuery();
return_cde = cmd.Parameters["return_cde"].Value.ToString();
所调用的“ Refresh()”方法的签名很简单:
Task.Run(async () =>
{
while (_runSensors)
{
var tasks = new List<Task>
{
Task.Factory.StartNew(() => {
_sensors.Find(item => item.Name == nameof(SensorA)).Refresh(); }, token),
Task.Factory.StartNew(() => {
_sensors.Find(item => item.Name == nameof(SensorB)).Refresh(); }, token),
Task.Factory.StartNew(() => {
_sensors.Find(item => item.Name == nameof(SensorC)).Refresh(); }, token)
};
await Task.WhenAll(tasks);
}
}
内部工作与问题无关的地方,基本上是从输入源读取并进行处理(转换/格式/等),并更新传感器对象的公共属性。
上面的每个“传感器”大约需要15-20毫秒(由秒表计算)。将每个传感器添加到上面的列表中后,运行时间将一直等待Task.WhenAll(tasks);。完成增加15-20ms。即。如果添加了8个传感器,则每次迭代大约需要120-160ms。
我想做的是让它们并行运行,以便说5个传感器每次迭代花费的时间与3个传感器大致相同。我的确意识到随着线程数量的增加,线程交换会产生一些开销
编辑#1-从传感器刷新方法
public void Refresh() { ... }