【发布时间】: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<List<string>>但您想将其分配给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