Использовать 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);
}