Возможны несколько способов. Поскольку вы новичок в C # и, вероятно, тесно связаны с пользовательским интерфейсом, я предлагаю вам использовать класс BackgroundWorker.
http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx
Вы можете передать свои аргументы, используя DoWorkEventArgs события DoWork.
Также при таком подходе и без общих объектов (через потоки) вы можете избежать использования блокировки или синхронизации
Я думаю, что это может быть лучшим решением для вас, но есть альтернативы. Вы можете использовать модель программирования Asynchronouse (APM) или даже Thread / ThreadPool или параллельную библиотеку задач.
Должен ли я просто использовать переменную состояния, защищенную блокировкой, и опрашивать ее каждый раз вокруг моей >> видеопотока; есть ли другие рекомендации?
Если у вас есть общее состояние, как у видеопотока, вам следует использовать синхронизацию потоков. Поэтому ответом будет «да», вам следует использовать некоторую защищенную переменную, вы можете избежать блокировки, используя только volatile, но подумайте об использовании других примитивов синхронизации. Потому что использование volatile просто гарантирует, что вы читаете / записываете наиболее актуальное значение, но не мешает другим потокам читать / писать.
Некоторые ссылки, чтобы выбрать, использовать ли блокировку (другие примитивы) или просто volatile:
Нужно ли блокировать или помечать как энергозависимые при доступе к простому логическому флагу в C #?
Летучий против блокировки и против блокировки