2013-04-25 52 views
1

让我们从UI线程(WPF,WinForms也可以)开始,并且UI线程创建后台线程来做一些工作(Threadpool),并在完成后台线程更新UI(使用调度程序)。 UI线程与后台线程共享资源,当后台线程完成其进程时需要处理它。如何配置在UI线程和后台线程之间共享的资源

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

回答

1

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

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

0

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

只要线程完成资源,它就必须减少参考计数。当ref计数达到0时,可以处理该资源。由于您正在使用线程,因此您需要将其与锁进行同步。一些伪代码:

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

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