2013-04-25 76 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(); 
    } 
}