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

C# 如何处理UI线程和后台线程之间共享的资源,c#,.net,multithreading,user-interface,C#,.net,Multithreading,User Interface,让我们从一个UI线程(WPF,WinForms也可以)开始,UI线程创建一个后台线程来做一些工作(线程池),完成后后台线程更新UI(使用dispatcher)。UI线程与后台线程共享一个资源,当后台线程完成其进程时,需要对其进行处理 实现这一点的最佳方法是什么?当后台线程完成其工作时,我们是否处理来自后台线程本身的资源?如果是这样的话,在创建线程后,我们不能使用UI线程中的资源,因为我们不知道后台线程何时完成,反之亦然。(此处没有可用的异步/等待功能)。当我们在这里处理UI线程时,需要保持GUI

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


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

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


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

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

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

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

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