2016-12-28 12 views
1

私はvs2015の弱い参照で物事をしようとしています、そして、ここでは、私が最後に作成したアクションインスタンスの弱い参照が完全に失われている理由を理解できない例がありますか?C#のWeakReference - アクションインスタンスはどのように失われましたか?

この問題で私を助けてもらえますか?アクションは、その時点ヌル値に有するので

は、ここでは、コードとInvokeメソッドAINTの呼出しです。しかし、それはnull値を持ってはいけません。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Class2 c1 = new Class2(); 
     Class4 c4 = new Class4(); 
     Class3 c3 = new Class3(); 
     c4.AssignActionA(c3, c4.CreateAction(c1)); 
     c4.AssignActionB(c3, c4.CreateAction(c1)); 
     GC.Collect(); 

     Class5 c5 = new Class5(); 
     c5.CallActionA(c3); 
     c5.CallActionB(c3); 

     //Task.Run(() => 
     //{ 
     // Class5 c5 = new Class5(); 
     // c5.CallAction(c3);  
     //}); 

     Console.ReadLine(); 
    } 
} 

public class Class5 
{ 
    public void CallActionA(Class3 c3) 
    { 
     Action a; 
     c3.A.TryGetTarget(out a); 
     a?.Invoke(); 
    } 

    public void CallActionB(Class3 c3) 
    { 
     c3.B(); 
    } 
} 

public class Class4 
{ 
    public Action CreateAction(Class2 c1) 
    { 
     //Class1 c1 = new Class1(); 
     Action a =() => 
     { 
      var temp = c1; 
     }; 

     return a; 
    } 

    public void AssignActionA(Class3 c3, Action a) 
    { 
     c3.A = new WeakReference<Action>(a); 
    } 

    public void AssignActionB(Class3 c3, Action b) 
    { 
     c3.B = b; 
    } 
} 

public class Class2 
{ 
} 

public class Class3 
{ 
    public WeakReference<Action> A { get; set; } 
    public Action B { get; set; } 
} 
+1

私はこのオブジェクトへのあなたの唯一の参照は弱い参照であり、あなたはgc collectを呼び出すと予想していました。 MSDNは「オブジェクトを参照する弱参照を表しますが、ガベージコレクションによってそのオブジェクトを再利用できるようにします」と述べています。コレクションから保護するための参照が必要です。私はこれが、一時的なオブジェクトが共有リソースへの参照を保持できるようにすることだと考えています。 – Jonathan

+1

あなたのコード例はミニマリストでなければならず、質問に関連するコードだけを含める必要があります。 – Phil1970

+0

私のコードを変更しました。どうして行動が失われるのか教えてください。アクションAのためには –

答えて

4

GCは、ガベージコレクションのマーク相を開始するために根を使用しています。サンプルコードで重要な根は、コレクションの開始時に実行されているメソッドのローカル変数だけです。他の静的フィールドなどはありません。そして、そこからはActionに到達する唯一の方法です。そのため(すなわち、WeakReferenceの全ポイントの)コレクションの対象である:

はまだそのオブジェクトがガベージコレクションによってクリアされることを可能にしながら、オブジェクトを参照する弱参照を表します。

ガベージコレクションを強制すると、強制的にガーベジコレクションが行われ、Iを呼び出すことはできなくなります。

+0

私のコードを変更しました。私が弱い参照で何が欠けているか見てみてください。どうも –

関連する問題