WPF中的线程锁定,带调度计时器

我有一个WPF C#应用程序,它使用分派器计时器来更新UI。WPF中的线程锁定,带调度计时器

在线程A中,在类DataProcessor中,我更新了一个变量,一个名为'FinalMarkers'的自定义结构。

static readonly Object mLock = new Object(); 

static List<Storage.FiducialMarkers> finalMarkers;

public List<Storage.FiducialMarkers> FinalMarkers

{

get { return finalMarkers; }

set

{

lock (mLock)

{

finalMarkers = value;

}

}

}

,然后线程运行中:

FinalMarkers = pullFiducialData();

在我的UI形式,我传递的DataProcessor到实例

我使用下面的锁定变量更新表单的构造函数。

 protected DataProcessor Data = null; 

public FormView(DataProcessor _Data)

{

Data = _Data;

}

然后我有一个调度员计时器调用变量:

DispatcherTimer timer = new DispatcherTimer(); 

timer.Interval = TimeSpan.FromMilliseconds(20);

timer.Tick += timer_Tick3d;

timer.Start();

在计时器滴答功能

,我抢值:

 List<Storage.FiducialMarkers> tmpList = new List<Storage.FiducialMarkers>(); 

tmpList = Data._processingArgs.FinalMarkers;

这将运行一段时间,然后崩溃没有错误。我处理线程锁定错误?

这是将数据从另一个线程传递到调度计时器的正确方法吗?

谢谢。

回答:

您需要取锁get以及set

public List<Storage.FiducialMarkers> FinalMarkers 

{

get {

lock (mLock) {

return finalMarkers;

}

}

set

{

lock (mLock)

{

finalMarkers = value;

}

}

}

如果您在呼吁set采取锁,然后你保护自己在同一时间运行两个setter方法,但是如果当你调用get你不采取锁则可以集合篡改与不协调的读者阅读时的价值;无论作者是否持有锁,这都会发生。该锁是多个线程之间的协议。如果只有一个线程(作者)被绑定到协议上,那么另一个线程(读者)将在不合时宜的时刻结束执行读取操作,并可能导致某种冲突或损坏。

锁说:“我们不要同时做这个代码块”。你必须让所有线程都同意通过将任何代码放入锁块中访问finalMarkers

仅供参考:结构本身具有值语义,因此它在执行get操作时被复制。

以上是 WPF中的线程锁定,带调度计时器 的全部内容, 来源链接: utcz.com/qa/265316.html

回到顶部