多个“任务”运行并行C#

时间:2018-11-02 07:12:59

标签: c# multithreading task-parallel-library

我正在尝试并行(多线程)运行多个任务,但是测试显示它们仍在并发运行。下面的代码似乎与我在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() { ... }

0 个答案:

没有答案