2012-02-13 59 views
2

編輯:我更新了我的代碼。這會實現我的目標嗎?如何將操作傳遞給目標較弱的任務工廠

我有一個方法的異步調用方法的工作集,但我有一個具體的問題,我通過lambda傳入的引用。具體來說,我有一個(子)窗口,開始一個操作並註冊一個回調。正如你所預料的那樣,即使我關閉了這個窗口,它仍然會被調用。

我想要做的是傳遞一種「弱引用」或構造一個弱引用。

Thhis是我建立我的動作(例如代碼)的方式:

static Action CreateNewAction(Action call, Action<SomeArg> callback, 
    Dispatcher dispatcher) 
{ 
    return delegate { 
     try 
     { 
      call(); 

      var target = callback.Target 
      if(target != null) 
       dispatcher.Invoke(callback, new SomeArg()); 
    } 
     catch (Exception ex) 
     { 
      // handle the ex in some way.. 
     } 
    }; 
} 

這是任務工廠是如何調用它:

var t = Task.Factory.StartNew(CreateNewAction(call, callback, dispatcher)) 

這是我會怎麼稱呼它(該呼叫僅將動作和回調通過到任務工廠如上所見):

WeakReference wr = new WeakReference(myTarget); 
StartMyTaskAsync(someAction, ((MyTargetClass)wr.Target).SomeCompletedFunc); 
+0

當你在一個關閉的窗口上調用該動作時會發生什麼? – svick 2012-02-13 15:24:24

+0

@svick hm好吧,我只是建立它,所以現在沒有多少發生,但它返回的數據,這可能會設置datacontext或我猜。 – UrbanEsc 2012-02-13 15:28:16

+0

那麼,爲什麼這是一個問題呢? – svick 2012-02-13 15:31:17

回答

0

該問題米來源於此行:

StartMyTaskAsync(someAction, ((MyTargetClass)wr.Target).SomeCompletedFunc); 

具體來說,這一部分:

((MyTargetClass)wr.Target).SomeCompletedFunc 

你物化WeakReference的目標,以獲取由要很久以前的λ/委託引用的方法實際檢查WeakReference是否放棄了Target

你真正想要做的是爲你的委託傳遞一個包裝,像這樣(你沒有顯示SomeCompletedFunc的簽名,所以我不知道這個電話會是什麼樣子,我假設它是對於這個問題的目的)一個參數的無效方法:

StartMyTaskAsync(someAction,() => { 
    // Check the weak reference. If null, return. 
    var target = wr.Target as MyTargetClass; 

    // If null, return. 
    if (target == null) return; 

    // If not null, call. 
    target.SomeCompletedFunc(); 
}); 

這樣,你檢查WeakReferenceTarget在你想調用的方法的時間,而不是在您指定的回調。

相關問題