【问题标题】:C# Multithreading String ArrayC# 多线程字符串数组
【发布时间】:2018-02-02 20:06:55
【问题描述】:

我感到非常困惑...我正在尝试实现对 Web API 的异步 C# 调用以转换值列表,我期望的结果是另一个 1 对 1 方式的列表。我们不介意顺序,我们只对速度感兴趣,据我们所知,服务器能够处理负载。

private object ReadFileToEnd(string filePath)
{
    //file read logic and validations...
    string[] rowData = new string[4]; //array with initial value
    rowData = translateData(rowData);
}

private async Task<List<string>> translateData(string[] Collection)
{
     //The resulting string collection.
     List<string> resultCollection = new List<string>();

     Dictionary dict = new Dictionary();

     foreach (string value in Collection)
     {
         Person person = await Task.Run(() => dict.getNewValue(param1, param2, value.Substring(0, 10)));

         value.Remove(0, 10);

         resultCollection.Add(person.Property1 + value);
     }

     return resultCollection;
}

我可能还有其他问题,比如返回类型,我只是没有让它工作。我的主要关注点是多线程并返回一个字符串数组。主线程来自 ReadFileToEnd(...) 已经注意到,如果我添加 await 它将需要向函数添加异步,我尽量不要更改太多。

【问题讨论】:

  • translateData 返回 Task&lt;List&lt;string&gt;&gt; 但您想将其分配给 string[] rowData
  • value.Remove(0, 10); 你没有将返回值赋给任何变量
  • await Task.Run(action) 不比action() 快。
  • string[] rowData = new string[4]; //array with initial value 如果要为其分配新值,则不必初始化它。 string[] rowData = translateData(rowData); 就够了。更简单的var rowData = translateData(rowData);
  • 认为将 async/await 修饰添加到数据处理循环会使其更快,或更高效,或者任何不正确的事情。使用 async/await 模式有两个很好的理由,即 1) 确保用户界面在负载下保持响应; 2) 将其应用于实际上从并行执行中受益的算法,并且在设计时考虑了并行性.在您的情况下,至少从您发布的代码中我可以看出,并行性只会导致不必要的开销。

标签: c# asp.net multithreading .net-4.6.2


【解决方案1】:

使用 Parallel ForEach 进行迭代,并在每次循环迭代中移除 await 调用。

        private IEnumerable<string> translateData(string[] Collection)
        {
            //The resulting string collection.
            var resultCollection = new ConcurrentBag<string>();

            Dictionary dict = new Dictionary();

            Parallel.ForEach(Collection,
                value =>
                {
                    var person = dict.getNewValue(param1, param2, value.Substring(0, 10));
                    value.Remove(0, 10);
                    resultCollection.Add(person.Property1 + value);
                });

            return resultCollection;
        }

您的尝试和并行性不正确。如果每次您向翻译发送并行请求时都停止当前迭代并等待结果(不继续循环),那么您什么都不做。

希望对您有所帮助!

【讨论】:

  • 为了方便起见,我稍微调整了参数类型,但与现实相差甚远。
猜你喜欢
  • 2014-10-19
  • 1970-01-01
  • 2011-08-13
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多