让我们从一个UI线程(WPF,WinForms也可以)开始,UI线程创建一个后台线程来做一些工作(线程池),完成后后台线程更新UI (使用dispatcher)。UI线程与后台线程共享资源,当后台线程完成其处理时,需要处理该资源。
实现这一点的最好方法是什么,当后台线程完成其工作时,我们是否处理后台线程本身的资源?如果是这样,我们就不能在创建线程后使用来自UI线程的资源,因为我们不知道后台线程什么时候完成,反之亦然。(这里没有异步/等待功能可用)。因为我们在这里处理UI线程,所以需要让GUI始终保持活动状态。
发布于 2013-04-25 21:56:32
我更喜欢让一个线程“拥有”资源并对其进行管理。如果UI线程拥有它,那么它可以将资源“借给”后台线程,但UI线程仍然负责处理它。这样,UI线程就可以使用该资源,并知道它是否被释放。
如果可能,最好让后台工作人员“拥有”资源,这样它就可以处理它,但在您的情况下,这听起来是不可能的。
发布于 2013-04-25 22:55:33
您可以为资源实现引用计数器。由于您知道有两个线程正在使用该资源,因此使用值2启动计数器。
每当线程使用完资源时,它都必须减少引用计数。当引用计数达到0时,可以释放资源。由于您使用的是线程,因此需要将其与锁同步。一些伪代码:
int myResourceRefCount = 2;
object syncLockObject = new Object();
void DecreaseRefCountForMyResource() {
lock(syncLockObject) {
--myResourceRefCount;
if(myResourceRefCount == 0)
DisposeMyResource();
}
}https://stackoverflow.com/questions/16216469
复制相似问题