【问题标题】:How to dispose a resource shared between UI thread and background thread如何处理 UI 线程和后台线程之间共享的资源
【发布时间】:2013-04-25 13:45:32
【问题描述】:
让我们从一个 UI 线程开始(WPF,WinForms 也可以),UI 线程创建一个后台线程来做一些工作(线程池),完成后后台线程更新 UI(使用调度程序)。 UI 线程与后台线程共享资源,需要在后台线程完成其进程时将其处理掉。
实现这一点的最佳方法是什么,我们是否在后台线程完成工作时释放来自后台线程本身的资源?如果是这样,我们无法在创建线程后使用来自 UI 线程的资源,因为我们不知道后台线程何时完成,反之亦然。 (并且这里没有可用的异步/等待功能)。由于我们在这里处理 UI 线程,因此需要始终保持 GUI 处于活动状态。
【问题讨论】:
标签:
c#
.net
multithreading
user-interface
【解决方案1】:
我的偏好是让一个线程“拥有”资源并对其进行管理。如果 UI 线程拥有它,那么它可以将资源“借出”给后台线程,但 UI 线程仍然负责处理它。这样 UI 线程可以使用资源并知道它是否被释放。
如果可能的话,最好让后台工作人员“拥有”资源,以便它可以处理它,但在你的情况下听起来这是不可能的。
【解决方案2】:
您可以为资源实现一个引用计数器。既然您知道有 2 个线程正在使用该资源,请以 2 的值启动计数器。
当一个线程用完资源后,它必须减少引用计数。当 ref 计数达到 0 时,可以释放资源。由于您使用的是线程,因此您需要将其与锁同步。一些伪代码:
int myResourceRefCount = 2;
object syncLockObject = new Object();
void DecreaseRefCountForMyResource() {
lock(syncLockObject) {
--myResourceRefCount;
if(myResourceRefCount == 0)
DisposeMyResource();
}
}