【发布时间】:2018-04-29 15:20:47
【问题描述】:
我有一个希望快速的问题。我正在尝试掌握异步代码,并且想知道最佳实践或最佳利用它。所以,如果你有一些代码,比如
public async void DoStuff()
{
await Task.Factory.StartNew(() => { LoadFile(); });
DoSomethingAfter();
}
public void LoadFile()
{
StreamReader sr = new StreamReader("file.txt");
String line;
while ((line = sr.ReadLine()) != null)
{
switch(line)
{
case "A":
parseObjectA(line, sr); //continues with its own loop
break;
case "B":
parseObjectB(line, sr); //continues with its own loop
break;
}
}
}
//added for clarity
public Object parseObjectA(String line, StreamReader sr)
{
Object obj = new Object();
while ((line = sr.ReadLine()) != null)
{
String element;
String value;
parseLine(line, out element, out value);
switch(element)
{
case "name":
obj.Name = value;
break;
case "position":
{
int pos = 0;
Int32.TryParse(value, out pos);
obj.position = pos;
break;
}
}
}
return obj;
}
StreamReader 循环是否阻塞了我设置的任务?我注意到读取我发送给它的文件比我不使用任务时花费的时间更长。函数是否需要一直异步?比如,parseObject 中发生的事情是否也需要异步,文件读取也需要异步?谢谢。
【问题讨论】:
-
您最好使用
await sr.ReadLineAsync,而不是通过StartNew()启动显式计算绑定Task -
“想知道最佳实践或最佳利用方法” 我已为这些链接添加了书签,希望您能像我一样发现它们提供的信息:best practices for the busy developer, @ 987654322@和Stephen C's blog - Task.Run etiquette
-
@MickyD 如果 LoadFiles 不仅仅是读取文件怎么办?或者,当 LoadFile() 完成时,任务中是否有另一个函数被调用?是否应该一直进行异步调用以充分利用线程?
-
我纯粹是按照你的例子来的。如果您有其他情况,请发布另一个问题或更新上述内容
-
await ReadLineAsync不会阻止。它甚至不使用线程!
标签: c# asynchronous stream threadpool