我在一个简单的控制台应用程序中使用C#的
以下是我目前拥有的代码。
async
和await
进行实验。我的目标很简单:以异步方式处理文件列表,以便处理一个文件不会阻塞其他文件的处理。这些文件之间互不依赖,并且有数千个文件需要处理。以下是我目前拥有的代码。
public class MyClass
{
public void Go()
{
string[] fileSystemEntries = Directory.GetFileSystemEntries(@"Path\To\Files");
Console.WriteLine("Starting to read from files!");
foreach (var filePath in fileSystemEntries.OrderBy(s => s))
{
Task task = new Task(() => DoStuff(filePath));
task.Start();
task.Wait();
}
}
private async void DoStuff(string filePath)
{
await Task.Run(() =>
{
Thread.Sleep(1000);
string fileName = Path.GetFileName(filePath);
string firstLineOfFile = File.ReadLines(filePath).First();
Console.WriteLine("{0}: {1}", fileName, firstLineOfFile);
});
}
}
我的Main()
方法仅仅调用了这个类:
public static class Program
{
public static void Main()
{
var myClass = new MyClass();
myClass.Go();
}
}
我好像缺失了异步编程模式的某些要素,因为每次运行程序时,似乎处理的文件数量是随机的,可以是没有处理任何一个文件,也可以是六个文件全部都处理了(在我的示例文件集中)。
基本上,主线程并不会等待所有文件都被处理完毕,这或许是异步运行的一部分,但我并不想这样。我只想:在尽可能多的线程中处理这些文件,但仍然需要等待它们全部完成处理后再结束。
new Task(() => DoStuff(filePath))
中,DoStuff
是一个async void
方法。你在这里进行了一次“fire-and-forget”(点火并忘记)调用,任务完成之前DoStuff
方法已经完成了,以及myClass.Go()
也完成了。 - noseratio - open to workParallel.ForEach
或Task.Factory.StartNew
,并让其余处理在IOCP线程上进行。虽然这方面已经有了重复的内容。 - noseratio - open to work