首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >写文章时的MonoTorrent事件

写文章时的MonoTorrent事件
EN

Stack Overflow用户
提问于 2019-11-16 11:50:26
回答 2查看 152关注 0票数 0

我一直试图使用C# MonoTorrent库,但缺乏文档无助于此。我试图流一个文件,但要做到这一点,我需要一个事件,无论何时,一个片段被写入文件,或类似的东西。

我知道有一个事件在任何时候都会被触发,但是当我需要实际的内容时,它就不那么有用了。

所以我想问我怎么知道什么时候一个片段被写到了一个文件中,这样我就可以解析它,然后再流到那个电影。

我已经看过了TorrentManagerClientEngineDiskManager,在这些类中没有发现任何有用的东西,也没有发现任何其他Manager类。现在,这个特性只是隐藏在某个地方,还是我必须做一些不同的事情来获得下载的片段?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-18 00:37:53

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

如果使用MemoryWriter,则在引发事件时,该数据可能不会写入底层硬盘/SSD。为了保证您需要调用FlushAsync方法,传入TorrentManager和片段索引。如果一个片段的大小为256 6kb,并且在第6部分中包含三个长度为200 6kb、50 6kb和6kb的文件,那么如果将'6‘作为片段索引传递,所有这些文件都将被刷新。如果您调用不需要PieceIndex的重载,那么它将刷新每个文件。

如果您正在编写类似于SlidingWindowPicker的内容,那么您可能应该只在下载了高优先级集中的一篇文章时才调用FlushAsync。任何对刷新的调用都将刷新给定文件(或所有文件)的所有挂起的数据。如果您拥有的唯一数据来自洪流的最末端,那么立即冲洗它不会影响您的流能力,但它可能会增加管理费用。

票数 1
EN

Stack Overflow用户

发布于 2019-11-20 09:42:55

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

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

如果您想要写一些东西来自动刷新碎片,您可以这样做:

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58890423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档