我在项目上遇到了.NET 4.0。 StreamReader不提供ReadLine的Async或Begin / End版本。底层的Stream对象有BeginRead / BeginEnd,但是它们采用一个字节数组,所以我必须逐行实现逻辑。
4.0 Framework中有什么东西可以实现这个目标吗?
答案 0 :(得分:1)
您可以使用Task
。您没有指定代码的其他部分,因此我不知道您想要做什么。我建议你避免使用Task.Wait
因为这会阻止UI线程并等待任务完成,这变得不是真的异步!如果要在任务中重写文件后执行其他操作,可以使用task.ContinueWith
。
这里有完整示例,如何在不阻止UI线程的情况下执行此操作
static void Main(string[] args)
{
string filePath = @"FILE PATH";
Task<string[]> task = Task.Run<string[]>(() => ReadFile(filePath));
bool stopWhile = false;
//if you want to not block the UI with Task.Wait() for the result
// and you want to perform some other operations with the already read file
Task continueTask = task.ContinueWith((x) => {
string[] result = x.Result; //result of readed file
foreach(var a in result)
{
Console.WriteLine(a);
}
stopWhile = true;
});
//here do other actions not related with the result of the file content
while(!stopWhile)
{
Console.WriteLine("TEST");
}
}
public static string[] ReadFile(string filePath)
{
List<String> lines = new List<String>();
string line = "";
using (StreamReader sr = new StreamReader(filePath))
{
while ((line = sr.ReadLine()) != null)
lines.Add(line);
}
Console.WriteLine("File Readed");
return lines.ToArray();
}
答案 1 :(得分:0)
您可以使用任务并行库(TPL)执行您尝试执行的某些异步行为。
将同步方法包装在任务中:
var asyncTask = Task.Run(() => YourMethod(args, ...));
var asyncTask.Wait(); // You can also Task.WaitAll or other methods if you have several of these that you want to run in parallel.
var result = asyncTask.Result;
如果您需要为StreamReader做很多事情,那么如果您想模拟常规异步方法,则可以继续将其转换为StreamReader的扩展方法。请注意错误处理和使用TPL的其他问题。