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

时间:2013-04-25 13:45:32

标签: c# .net multithreading user-interface

让我们从UI线程开始(WPF,WinForms也很好),UI线程创建一个后台线程来做一些工作(Threadpool),当完成后,后台线程更新UI(使用调度程序)。 UI线程与后台线程共享资源,当后台线程完成其进程时需要将其处理掉。

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

2 个答案:

答案 0 :(得分:1)

我的偏好是让一个线程“拥有”资源并对其进行管理。如果UI线程拥有它,那么它可以将资源“贷款”到后台线程,但UI线程仍然负责处理它。通过这种方式,UI线程可以使用资源并知道它是否被处置。

如果可能的话,后台工作者最好“拥有”资源,以便它可以处理它,但听起来在你的情况下是不可能的。

答案 1 :(得分:1)

您可以为资源实现ref计数器。由于您知道2个线程正在使用资源,因此请使用值2启动计数器。

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

int myResourceRefCount = 2;
object syncLockObject = new Object();

void DecreaseRefCountForMyResource() {
    lock(syncLockObject) {
       --myResourceRefCount;
       if(myResourceRefCount == 0)
           DisposeMyResource();
    }
}