3

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

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

该应用程序是用 C# .NET 编写的。

伪代码:

while (reader.Read())
{
    foreach(writer in writers)
    {
        writer.WriteToStream();
    }
}

我需要能够实现停止或暂停。哪个可以这样工作。要停止,将 continue 标记为 false:

while (reader.Read() && Continue)
{
    foreach(writer in writers)
    {
        writer.WriteToStream();
    }
}

显然在这个阶段我需要记录读取的字节数,以及写入每个写入源的字节数。

我的问题是:

如果我只记录读取的字节,并将其用于重新启动,则一个或多个写入者可能已经写入,而其他写入者则没有。简单地使用读取进度的度量重新启动可能会损坏写入的数据。所以我需要使用“每个作者的写入字节数”记录作为我的新开始位置。如何确定字节已写入(我可能无法从写入源读取文件以读取文件长度)?

任何人都可以就此类问题向我提供建议或指出正确的方向吗?

4

1 回答 1

2

使用线程同步事件。

(伪代码):

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,它会直接继续发出信号(而不是使用标志 and Thread.Sleep()

另一个注意事项是,任何检查都应该是since中的第一个参数,否则将从流中读取(但内容将被忽略,因为标志将阻止 while 块被执行)。whilereader.Read()

于 2011-12-06T11:11:32.240 回答