写文章时的 MonoTorrent 事件

MonoTorrent Event when piece written

我一直在尝试使用 C# MonoTorrent 库,但缺少文档也无济于事。我正在尝试流式传输文件,但为此,每当将 Piece 写入文件或类似内容时,我都需要一个事件。

我知道每当对 Piece 进行哈希处理时都会触发一个事件,但是当我需要实际内容时它就没那么有用了。

所以我想问一下我怎么知道什么时候一个片段已经写入文件,所以我可以解析它然后播放那部电影。

我已经查看了 TorrentManagerClientEngineDiskManager,但我在这些 class 和任何其他管理器中都没有发现任何有用的东西 class。现在这个功能只是隐藏在某个地方,还是我必须做一些不同的事情才能获得下载的片段?

PieceHashed 事件正是您所需要的。引发该事件时,您可以保证与该片段关联的数据已被接收、验证并写入 DiskManager。

如果是MemoryWriter is being used that data may not be written to the underlying harddrive/SSD when the event is raised. To guarantee that you'll need to call the FlushAsync方法,传入TorrentManager和piece index。如果一个片段的大小为 256kB,并且片段 6 中包含长度为 200kb、50kb 和 6kb 的三个文件,如果您将“6”作为片段索引传递,这三个文件将被刷新。如果您调用不带 PieceIndex 的重载,它将刷新每个文件。

如果您正在编写类似 SlidingWindowPicker 的内容,那么您应该只在下载了高优先级集中的片段时才调用 FlushAsync。对 flush 的任何调用都会刷新给定文件(或所有文件)的 all 未决数据。如果您拥有的唯一数据来自 torrent 的最后,那么立即刷新它不会影响您的流式传输能力,但它可能会增加开销。

还有一个替代方法,即实现 IPieceWriter 并创建一个包装器,只要写入适当的片段,它就会刷新。

现有的 MemoryWriter 显示了如何创建包装器。它的Write方法实现如下:https://github.com/mono/monotorrent/blob/2209922c4159e394242c6c337401571312642b6e/src/MonoTorrent/MonoTorrent.Client.PieceWriters/MemoryWriter.cs#L118-L123 .

如果你想写一些东西来自动刷新片段你会做这样的事情:

public void Write(TorrentFile file, long offset, byte[] buffer, int bufferOffset, int count, bool forceWrite)
{
    Writer.Write(file, offset, buffer, bufferOffset, count);
    Writer.Flush(file);
}