0

我想在这个函数中使用 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 上运行良好?

4

1 回答 1

0

我想添加代码来锁定函数,直到每次完成写入采样数据。

您真正想要的是有序执行,而不仅仅是互斥。因此,a 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);
}
于 2014-12-23T14:49:10.370 回答