C# AngleSharp 解析流有什么问题?
What is wrong in C# AngleSharp parse stream?
问题是,没有将所需数量的标题写入文档,而是仅将一部分写入了文档。控制台输出正常。
此处代码:
using AngleSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AngleSharp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("ok start");
Mainpar();
Console.ReadKey();
}
static async Task Mainpar()
{
// Setup the configuration to support document loading
var config = Configuration.Default.WithDefaultLoader();
// Load the names of all The Big Bang Theory episodes from Wikipedia
var address = "https://en.wikipedia.org/wiki/List_of_The_Big_Bang_Theory_episodes";
// Asynchronously get the document in a new context using the configuration
var document = await BrowsingContext.New(config).OpenAsync(address);
// This CSS selector gets the desired content
var cellSelector = "tr.vevent td:nth-child(3)";
// Perform the query to get all cells with the content
var cells = document.QuerySelectorAll(cellSelector);
// We are only interested in the text - select it with LINQ
var titles = cells.Select(m => m.TextContent).ToArray();
var allnum = titles.Count();
System.IO.StreamWriter sw = new System.IO.StreamWriter(@"C:\bd.txt");
for (int i = 0; i <= allnum; i++)
{
sw.WriteLine(titles[i] + i);
Console.WriteLine(titles[i] + i);
}
}
}
}
不知道是什么问题is.A不同数量的标题被写入文件,后者不是completely.Maybe线程被阻塞或程序简单地关闭..我不明白这取决于
您应该正确关闭流。可能发生的情况是,当您的程序关闭而没有刷新到文件时,流被强行关闭。尝试换行在 using 语句中:
using (var sw = new System.IO.StreamWriter(@"C:\bd.txt"))
{
for (int i = 0; i <= allnum; i++)
{
sw.WriteLine(titles[i] + i);
Console.WriteLine(titles[i] + i);
}
}
using
语句确保流正确关闭并在您完成使用后刷新到磁盘。
此外,因为您没有在 MainPar
方法中使用 await
,也没有在 main 方法中使用 await
调用它,所以没有充分的理由标记它 async
。它应该只是 static void
。除非您异步调用它,否则仅向该方法添加 async
关键字没有帮助。如果你想让 MainPar
真正异步,你可以使用 StreamWriter.WriteLineAsync(string)
方法:
using (var sw = new System.IO.StreamWriter(@"C:\bd.txt"))
{
for (int i = 0; i <= allnum; i++)
{
await sw.WriteLineAsync(titles[i] + i);
Console.WriteLine(titles[i] + i);
}
}
然后您可以像这样在 Main 方法中调用它:
static void Main(string[] args)
{
Task.Run(async () =>
{
Console.WriteLine("ok start");
await Mainpar();
Console.ReadKey();
}).GetAwaiter().GetResult();
}
问题是,没有将所需数量的标题写入文档,而是仅将一部分写入了文档。控制台输出正常。
此处代码:
using AngleSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AngleSharp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("ok start");
Mainpar();
Console.ReadKey();
}
static async Task Mainpar()
{
// Setup the configuration to support document loading
var config = Configuration.Default.WithDefaultLoader();
// Load the names of all The Big Bang Theory episodes from Wikipedia
var address = "https://en.wikipedia.org/wiki/List_of_The_Big_Bang_Theory_episodes";
// Asynchronously get the document in a new context using the configuration
var document = await BrowsingContext.New(config).OpenAsync(address);
// This CSS selector gets the desired content
var cellSelector = "tr.vevent td:nth-child(3)";
// Perform the query to get all cells with the content
var cells = document.QuerySelectorAll(cellSelector);
// We are only interested in the text - select it with LINQ
var titles = cells.Select(m => m.TextContent).ToArray();
var allnum = titles.Count();
System.IO.StreamWriter sw = new System.IO.StreamWriter(@"C:\bd.txt");
for (int i = 0; i <= allnum; i++)
{
sw.WriteLine(titles[i] + i);
Console.WriteLine(titles[i] + i);
}
}
}
}
不知道是什么问题is.A不同数量的标题被写入文件,后者不是completely.Maybe线程被阻塞或程序简单地关闭..我不明白这取决于
您应该正确关闭流。可能发生的情况是,当您的程序关闭而没有刷新到文件时,流被强行关闭。尝试换行在 using 语句中:
using (var sw = new System.IO.StreamWriter(@"C:\bd.txt"))
{
for (int i = 0; i <= allnum; i++)
{
sw.WriteLine(titles[i] + i);
Console.WriteLine(titles[i] + i);
}
}
using
语句确保流正确关闭并在您完成使用后刷新到磁盘。
此外,因为您没有在 MainPar
方法中使用 await
,也没有在 main 方法中使用 await
调用它,所以没有充分的理由标记它 async
。它应该只是 static void
。除非您异步调用它,否则仅向该方法添加 async
关键字没有帮助。如果你想让 MainPar
真正异步,你可以使用 StreamWriter.WriteLineAsync(string)
方法:
using (var sw = new System.IO.StreamWriter(@"C:\bd.txt"))
{
for (int i = 0; i <= allnum; i++)
{
await sw.WriteLineAsync(titles[i] + i);
Console.WriteLine(titles[i] + i);
}
}
然后您可以像这样在 Main 方法中调用它:
static void Main(string[] args)
{
Task.Run(async () =>
{
Console.WriteLine("ok start");
await Mainpar();
Console.ReadKey();
}).GetAwaiter().GetResult();
}