Использовать ReaderWriterLock в C# xaml

Я хочу использовать ReaderWriterLock в этой функции:

    static async void ETDGazeDataEvent(ETMWNet.ETGazeDataType pGazeData)
    {
        StorageFolder ETfolder = ApplicationData.Current.LocalFolder;
        StorageFile file = await ETfolder.CreateFileAsync("Log.ETDGazeDataEvent.txt", CreationCollisionOption.OpenIfExists);
        String ETAnswer = pGazeData.FrameNum + " Time: " + pGazeData.TimeStamp + " X: " + pGazeData.Left.GazePointPixels.x + " Y: " + pGazeData.Left.GazePointPixels.y + " \r\n";
        await Windows.Storage.FileIO.AppendTextAsync(file, ETAnswer);
    }

Эта функция вызывается 30 раз в секунду, и каждый раз функция записывает данные в текстовый файл. Я хочу добавить код, который блокирует функцию до тех пор, пока она не завершит запись выборочных данных каждый раз. какой код мне нужно добавить, чтобы он хорошо работал на vs2013 C# xaml?

1 ответ

Я хочу добавить код, который блокирует функцию до тех пор, пока она не завершит запись выборочных данных каждый раз.

То, что вы действительно хотите, это заказное исполнение, а не просто взаимное исключение. Итак, ReaderWriterLock (или любой другой примитив взаимного исключения) является неправильным решением. Тем не менее, очередь будет работать нормально.

Вокруг не слишком много готовых к асинхронизации очередей, но у TPL Dataflow есть хорошая, называемая ActionBlock, Вы можете использовать это так:

private static readonly ActionBlock<ETMWNet.ETGazeDataType> _queue = new ActionBlock<ETMWNet.ETGazeDataType>(
  async pGazeData =>
  {
    StorageFolder ETfolder = ApplicationData.Current.LocalFolder;
    StorageFile file = await ETfolder.CreateFileAsync("Log.ETDGazeDataEvent.txt", CreationCollisionOption.OpenIfExists);
    String ETAnswer = pGazeData.FrameNum + " Time: " + pGazeData.TimeStamp + " X: " + pGazeData.Left.GazePointPixels.x + " Y: " + pGazeData.Left.GazePointPixels.y + " \r\n";
    await Windows.Storage.FileIO.AppendTextAsync(file, ETAnswer);
  });

static void ETDGazeDataEvent(ETMWNet.ETGazeDataType pGazeData)
{
  _queue.Post(pGazeData);
}
Другие вопросы по тегам