c#-创建仅由局部变量引用的BackgroundWorker对象是否定义明确?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-创建仅由局部变量引用的BackgroundWorker对象是否定义明确?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1788字,纯文字阅读大概需要3分钟。
内容图文
![c#-创建仅由局部变量引用的BackgroundWorker对象是否定义明确?](/upload/InfoBanner/zyjiaocheng/668/1f695c235b3e4444bbf3325ab2c900ed.jpg)
我是C#和WPF的新手.我花了几个小时阅读在线文档和示例来回顾一些代码.该代码子类化System.Windows.Controls.Page并使用BackgroundWorker进行后台计算.
从我学到的知识,在这种情况下创建BackgroundWorker对象的理想方法是使它由类成员变量引用.
例如.,
public class MyPage: System.Windows.Controls.Page
{
// Or: backgroundWorker = new System.ComponentModel.BackgroundWorker()
private System.ComponentModel.BackgroundWorker backgroundWorker;
..
}
但是正在检查的代码创建了一个局部变量引用的对象.
// Inside a class member function
if (someCondition)
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(DoWork1);
worker.DoWork += new DoWorkEventHandler(DoWork2);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted);
worker.RunWorkerAsync(this.DataContext);
}
这个定义好吗?在工作人员超出范围之后,该对象是否才有资格获得GC,因为它显然是对该对象的唯一引用?还是由于这些asnyc函数回调,框架添加了额外的引用计数?
所谓“定义明确”,是指可以保证工作对象至少在所有回调(例如RunWorkerCompleted)完成之前都保留在内存中.
谢谢!
解决方法:
只要您调用RunWorkerAsync()方法,BackgroundWorker就不会立即有资格进行垃圾回收.您可以使用WeakReference自己确认这一点:
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerSupportsCancellation = true;
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(DoWork1);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted);
worker.RunWorkerAsync();
WeakReference viewModelWeakReference = new WeakReference(worker);
worker = null;
GC.Collect();
GC.WaitForPendingFinalizers();
MessageBox.Show(viewModelWeakReference.IsAlive.ToString());
即使在调用RunWorkerAsync()之后立即处置它,它也仍然会徘徊直到完成.
内容总结
以上是互联网集市为您收集整理的c#-创建仅由局部变量引用的BackgroundWorker对象是否定义明确?全部内容,希望文章能够帮你解决c#-创建仅由局部变量引用的BackgroundWorker对象是否定义明确?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。