我正在寻找有关在文件流传输中实现停止和重启的文本或建议。
目标是让应用程序使用单个读取源,并输出到多个写入源,并且能够在传输失败时从记录的位置重新启动。
应用程序是用 C# .NET 编写的。
伪代码:
while (reader.Read())
{
foreach(writer in writers)
{
writer.WriteToStream();
}
}
我需要能够实现停止或暂停。哪个可以这样工作。要停止,continue 被标记为 false:
while (reader.Read() && Continue)
{
foreach(writer in writers)
{
writer.WriteToStream();
}
}
显然在这个阶段我需要记录读取的字节数,以及写入每个写源的字节数。
我的问题是:
如果我只记录读取的字节,并将其用于重新启动,一个或多个作者可能已经写了,而其他人没有。简单地使用读取进度的度量重新启动可能会损坏写入的数据。所以我需要使用“每个作者写入的字节数”记录作为我的新起始位置。我如何确定字节已写入(我可能无法从写入源读取文件以读取文件长度)?
任何人都可以建议或指出有关此类问题的文本的正确方向吗?
最佳答案
使用线程同步事件。
(伪代码):
ManualResetEvent _canReadEvent = new ManualResetEvent(true);
public void WriterThreadFunc()
{
while (_canReadEvent.Wait() && reader.Read())
{
foreach(writer in writers)
{
writer.WriteToStream();
}
}
}
public void Pause()
{
_canReadEvent.Reset();
}
public void Continue()
{
_canReadEvent.Set();
}
好处是写入线程在暂停时不会消耗任何 CPU,它会直接继续(而不是使用标志和 Thread.Sleep()
)
另一个注意事项是任何检查都应该是 while
中的第一个 参数。自 reader.Read()
否则将从流中读取(但内容将被忽略,因为该标志将阻止执行 while block )。
关于c# - 在文件流传输中实现停止和重新启动 - 如何实现? C# 网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8398642/