c# - 在文件流传输中实现停止和重新启动 - 如何实现? C# 网络

标签 c# .net filestreams

我正在寻找有关在文件流传输中实现停止和重启的文本或建议。

目标是让应用程序使用单个读取源,并输出到多个写入源,并且能够在传输失败时从记录的位置重新启动。

应用程序是用 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/

相关文章:

c# - 在 Azure Web Apps 上发布带有 Angular 7 的 .NET Core 2.1 - 尝试运行 'ng serve'

c# - 通过代理读取外部 XML

c# - 通过接口(interface)访问时,DbContext 在查询时抛出异常

c# - 缺少的文件是packages\Microsoft.Net.Compilers.2.4.0\build\Microsoft.Net.Compilers.props

C++ 文件写入包括字符串的内存地址而不是内容

c# - 从多个线程访问 word 文档的单词列表

c# - await Task.Delay 花费的时间比预期的要长

c# - WinForms 将非透明字符串绘制成透明窗体

delphi - TStringList.SaveToFile 的等效 'streams' 代码是什么?对于大量数据,哪个更好?

Java从文件中的任意位置打开流