2012-02-13 10 views
2

編集:コードを更新しました。これは私が目指しているものを達成するだろうか?ターゲットへの弱参照のあるタスクファクトリにアクションを渡す方法

私はメソッドの非同期呼び出しのためのメソッドの作業セットがありますが、私はラムダ経由で渡す参照に特定の問題があります。特に私は操作を開始し、コールバックを登録する(子)ウィンドウがあります。ご想像のとおり、このウィンドウを閉じても、まだ呼び出されます。

私がしたいことは、「弱い参照」の一種を渡すか、入ってくるアクションから弱い参照を構築することです。

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

+0

@svick hm私はちょうどそれほど現実的ではないが、それを構築しているが、それはデータを返し、それはおそらくdatacontextまたは私が推測する何かに設定することができる。 – UrbanEsc

+0

それで、どうしてそれが問題になるのですか? – svick

答えて

0

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

具体的には、この部分:

((MyTargetClass)wr.Target).SomeCompletedFunc 

あなたは、あなたがしたいずっと前にラムダ/デリゲートによって参照されているメソッドを取得するためにWeakReferenceの対象を実体化されているmがこの行から来ています実際にはWeakReferenceTargetを放棄しているかどうかを確認してください。

本当にしたいのは、デリゲートのラッパーを渡すことです(これは、SomeCompletedFuncの署名を表示していないので、コールがどのようなものになるかはわかりません。この質問)の目的のためのパラメータなしのvoidメソッド:あなたはコールバックを割り当てるとき

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をチェックして、ではありません。