[MonoTorrent撰写文章时的事件

问题描述 投票:0回答:2

我一直在尝试使用C#MonoTorrent库,但是缺少文档无济于事。我正在尝试流式传输文件,但是要做到这一点,无论何时将片断写入文件或类似的东西,我都需要一个事件。

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

因此,我想问我如何知道何时将片段写入文件,以便我可以解析该片段然后流式传输电影。

我已经看过TorrentManagerClientEngineDiskManager,但在这些类或任何其他Manager类中都没有发现任何有用的东西。现在,此功能是否仅隐藏在某个位置,还是我需要做一些其他事情才能获得下载的片段?

c# stream monotorrent
2个回答
1
投票

pieceHashed事件是您所需要的。发生该事件时,可以保证与该文件相关的数据已被接收,验证并写入DiskManager。

如果正在使用MemoryWriter,则在引发事件时可能不会将数据写入基础硬盘驱动器/ SSD。为了保证您需要调用FlushAsync方法,传入TorrentManager和段索引。如果片段大小为256kB,并且片段6中包含三个长度分别为200kb,50kb和6kb的文件,则如果您输入“ 6”作为片段索引,则将刷新所有这三个文件。如果您调用不占用PieceIndex的重载,它将刷新每个文件。

如果您正在编写类似SlidingWindowPicker的内容,则可能仅应在下载高优先级集中的作品时才调用FlushAsync。对flush的任何调用都将刷新给定文件(或所有文件)的all待处理数据。如果您仅有的数据来自洪流的尽头,则立即将其刷新不会影响您的流传输能力,但可能会增加开销。


0
投票

还有一种替代方法,它是实现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);
}
© www.soinside.com 2019 - 2024. All rights reserved.