私は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; }
}
私はこのオブジェクトへのあなたの唯一の参照は弱い参照であり、あなたはgc collectを呼び出すと予想していました。 MSDNは「オブジェクトを参照する弱参照を表しますが、ガベージコレクションによってそのオブジェクトを再利用できるようにします」と述べています。コレクションから保護するための参照が必要です。私はこれが、一時的なオブジェクトが共有リソースへの参照を保持できるようにすることだと考えています。 – Jonathan
あなたのコード例はミニマリストでなければならず、質問に関連するコードだけを含める必要があります。 – Phil1970
私のコードを変更しました。どうして行動が失われるのか教えてください。アクションAのためには –