C# 写入工件时的MonoTorrent事件

C# 写入工件时的MonoTorrent事件,c#,stream,monotorrent,C#,Stream,Monotorrent,我一直在尝试使用C#MonoTorrent库,但缺少文档并没有帮助。我试图流式传输一个文件,但要做到这一点,无论何时将一个片段写入文件或类似的内容,我都需要一个事件 我知道每当一个片段被散列时就会触发一个事件,但是当我需要实际内容时,它就没有那么有用了 所以我想问一下,我如何知道一个片段何时被写入到一个文件中,这样我就可以解析它,然后流式传输那个电影 我已经查看了TorrentManagerClientEngineDiskManager的。现在,这项功能只是隐藏在某个地方,还是我必须做一些不同的

我一直在尝试使用C#MonoTorrent库,但缺少文档并没有帮助。我试图流式传输一个文件,但要做到这一点,无论何时将一个片段写入文件或类似的内容,我都需要一个事件

我知道每当一个片段被散列时就会触发一个事件,但是当我需要实际内容时,它就没有那么有用了

所以我想问一下,我如何知道一个片段何时被写入到一个文件中,这样我就可以解析它,然后流式传输那个电影


我已经查看了
TorrentManager
ClientEngineDiskManager的
。现在,这项功能只是隐藏在某个地方,还是我必须做一些不同的事情才能获得下载的片段?

您需要的是片段哈希事件。当引发该事件时,可以保证已接收、验证并将与该数据块相关的数据写入DiskManager

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


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

还有另一种选择,即实现IPieceWriter并创建一个包装器,每当写入适当的片段时,该包装器都会刷新

现有MemoryWriter演示了如何创建包装器。它的写入方法实现如下:

如果您想写一些东西来自动刷新片段,您可以执行以下操作:

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);
}

非常感谢您的回答,我不知道FlushAsync方法。在这种情况下,使用PieceHashed方法解决我的问题应该没有问题。我一直在尝试在客户端引擎的DiskManager上调用FlushAsync方法,但它似乎并不存在。Intellisense没有显示该方法,编译器抱怨它也不存在。我有最新的NuGet版本,有没有可能缺少什么?我还使用dotPeek反编译了NuGet的dll,它也显示了这些方法的缺失。我刚刚看到,你最近才公开了这些方法。你认为你能很快把它们上传到nuget上吗,否则我可以自己编译。但无论如何,还是要感谢你花时间做这些更改。它现在是最新的nuget版本!我将用一个稍微复杂一点的选项发表评论。