我读了问题的答案.事件处理程序是否阻止了垃圾收集的发生?,但是当发布者成为目标时会发生什么?
更具体地说,我正在为WPF应用程序使用MVVM设计.Model-View类会在每次更改时引发NotifyPropertyChanged.在某些类中,我需要在修改某些内容时调用方法.
我想这样做:
this.PropertyChanged += this.MyHandler;
Run Code Online (Sandbox Code Playgroud)
这个实例会被GC破坏吗?
我的GUI类中有一个后台工作程序.
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
ProgressClass obj = new ProgressClass();
Importer tradeImporter = e.Argument as Importer;
BackgroundWorker worker = sender as BackgroundWorker;
List<TradeUploadInfo> list = obj.AllocateTrades2(tradeImporter, false);
e.Result = list; //Passes the list for processing
}
Run Code Online (Sandbox Code Playgroud)
进口商是我自己的班级.现在,该AllocateTrades2方法已完成所有处理.
我的问题是,如何在不将bw作为参数传递的情况下在不同的类中执行方法bw.ProgressReport内部AllocateTrades2?
如果有人向我解释如何用事件做这件事,但是如果还有另一种优雅的方式,那会很棒.我很开心.
我有一个类,里面有一个static List<T>字段,里面有我所有的东西; 每个对象代表一个正在运行的进程及其属性.
在该过程完成其工作后,相关对象将从中删除List<T>,然后我的UI将更新.
从我的列表中删除对象后,我应该将此对象更改null为释放资源吗?
我读到了Eric Lippert 的精彩解释,内容是关于当一个对象通过事件引用另一个对象时,何时会被垃圾收集。
为了证明埃里克所说的,我尝试了这段代码:
using System;
public class Program
{
public static void Main()
{
{
var myClass = new GCClass();
LongLivingClass.MyEvent += myClass.HandleEvent;
} // LongLivingClass holds a reference to myClass
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
// expect: finalizer of GCLass not run
{
var myClass = new GCClass();
myClass.MyEvent += LongLivingClass.HandleEvent;
} // myClass can easily be GCed here
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
// expect: finalizer should run
Console.WriteLine("Finish");
}
}
class GCClass
{
public event EventHandler MyEvent;
public …Run Code Online (Sandbox Code Playgroud) 我偶然发现了这个问题:ContentView中的按钮导致MonoTouch运行时崩溃.Monotouch 4.0中的错误?而询问者对Monotouch的"更具侵略性"的垃圾收集器存在问题.
也许其中一个Xamarin团队可以总结一些注意事项并给出一个很好的解释?
我目前正在从MT 3.2.6升级到MT 4.1,并希望查看我的代码并检查需要更改的内容.
可能重复:
事件处理程序是否阻止垃圾收集发生?
我有一个像这样的wp7应用程序:
private void button1_Click(object sender, RoutedEventArgs e)
{
GeoCoordinateWatcher watcher = new GeoCoordinateWatcher();
watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);
watcher.Start();
}
void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
Debug.WriteLine(e.Position.Timestamp.ToString());
}
Run Code Online (Sandbox Code Playgroud)
单击两次按钮后,控制台将输出两次Timestamp.但观察者是一个局部变量!它出什么问题了?我怎么能打扰它呢?