2014-12-23 5 views
0

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

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?

+0

Создайте новое поле статического объекта в классе. Окружать ваш блок кода оператором блокировки в статическом поле – Sievajet

ответ

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