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

この関数は 1 秒間に 30 回呼び出され、そのたびに関数はデータをテキスト ファイルに書き込みます。毎回サンプリングしたデータを書き終わるまで関数をロックするコードを追加したい。vs2013 c# xaml でうまく動作するように、どのコードを追加する必要がありますか?

4

1 に答える 1

0

毎回サンプリングしたデータを書き終わるまで関数をロックするコードを追加したい。

本当に欲しいのは、相互排除だけでなく、順序付けられた実行です。したがって、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 に答える