Реализация остановки и перезапуска при передаче файлового потока - как? C # .NET - PullRequest
3 голосов
/ 06 декабря 2011

Я ищу тексты или советы по реализации остановки и перезапуска при передаче файлового потока.

Цель состоит в том, чтобы приложение использовало один источник чтения и выводил данные в несколько источников записи, а такжеперезапустить с записанной позиции, если передача не удалась.

Приложение пишется на C # .NET.

Код Psuedo:

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

Мне нужно иметь возможностьосуществить остановку или паузу.Который мог бы работать так.Для остановки продолжения помечается как ложное:

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

Очевидно, что на этом этапе мне нужно записать количество прочитанных байтов и количество байтов, записанных в каждый источник записи.

Мои вопросыявляются:

Если бы я записывал только прочитанные байты и использовал это для перезапусков, один или несколько авторов могли бы написать, а другие нет.Простой перезапуск с использованием показателя прогресса чтения может повредить записанные данные.Поэтому мне нужно использовать запись «записано байт на записывающее устройство» в качестве моей новой стартовой позиции.Как я могу быть уверен, что байты были записаны (у меня может не быть возможности прочитать файл из источника записи, чтобы прочитать длину файла)?

Может кто-нибудь посоветовать или указать мне правильное направлениетекст по этому вопросу?

1 Ответ

2 голосов
/ 06 декабря 2011

Использовать событие синхронизации потока.

(псевдокод):

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

Хорошо, что поток записи не будет использовать процессор, когда он приостановлен, и будет продолжаться напрямуюон сигнализируется (в отличие от использования флага и Thread.Sleep())

Другое замечание: любая проверка должна быть аргументом first в while, так какreader.Read() будет считывать из потока иначе (но содержимое будет игнорироваться, так как флаг будет препятствовать выполнению блока while).

...