如何处理UI线程和后台线程之间共享的资源

本文关键字:线程 后台 之间 共享 资源 UI 何处理 处理 | 更新日期: 2023-09-27 18:10:48

让我们从一个UI线程开始(WPF, WinForms也可以),UI线程创建一个后台线程来做一些工作(线程池),当后台线程完成后更新UI(使用分派器)。UI线程与后台线程共享一个资源,当后台线程完成它的进程时,它需要被处理掉。

什么是最好的方法来实现这一点,我们处理资源从后台线程本身当它完成它的工作?如果是这样,我们就不能在创建线程后使用UI线程中的资源,因为我们不知道后台线程何时完成,反之亦然。(这里没有async/await功能)。由于我们在这里处理的是UI线程,因此需要始终保持GUI活动。

如何处理UI线程和后台线程之间共享的资源

我的偏好是一个线程"拥有"资源并管理它。如果UI线程拥有它,那么它可以将资源"借给"后台线程,但UI线程仍然负责处理它。通过这种方式,UI线程可以使用资源并知道它是否被释放。

如果可能的话,最好让后台工作器"拥有"资源,这样它就可以处理它,但听起来这在你的情况下是不可能的。

您可以为资源实现一个ref计数器。由于您知道有2个线程正在使用该资源,因此将计数器的值设置为2。

当一个线程用完资源时,它必须减少ref计数。当refcount达到0时,资源可以被处理。由于使用的是线程,因此需要将其与锁同步。一些伪代码:

int myResourceRefCount = 2;
object syncLockObject = new Object();
void DecreaseRefCountForMyResource() {
    lock(syncLockObject) {
       --myResourceRefCount;
       if(myResourceRefCount == 0)
           DisposeMyResource();
    }
}