我在不同的线程中使用相同的数据流对象。
是否必须在数据流对象上使用锁,或者对象是否自动线程安全?
例如:
// Dataflow object defined
ITargetBlock<FileQueueItem> producerChange = new BufferBlock<FileQueueItem>();
TransformBlock<FileQueueItem, FileQueueItem> transformBlock = new TransformBlock<FileQueueItem, FileQueueItem>(
f =>
{/*...*/});
ActionBlock<FileQueueItem> actionBlock = new ActionBlock<FileQueueItem>(f=>
{/*...*/});
// DataFlow objects linked
producerChange .LinkTo(transformBlock );
transformBlock .LinkTo(actionBlock);
// DataFlow object method where datadlow objects used in a thread
public async void OnRunDataFlow(FileQueueItem f)
{
Task.Run(() =>
{
var sent = await producerChange.SendAsync(f);
});
}
不,对象不会自动成为线程安全的。如果您的数据流设置允许多个线程同时使用同一对象,则必须使用
lock
语句适当地同步对对象的访问,否则对象的状态可能会损坏。