我何时在类上实现IDispose而不是析构函数?我读过这篇文章,但我仍然忽略了这一点.
我的假设是,如果我在一个对象上实现IDispose,我可以显式"破坏"它,而不是等待垃圾收集器这样做.它是否正确?
这是否意味着我应该总是在对象上显式调用Dispose?这有什么常见的例子?
MSDN用于实现Dispose()方法的示例模式描述了将对已处置的受管资源的引用设置为null(_resource = null),但在if (disposing)块外部执行此操作:
protected virtual void Dispose(bool disposing)
{
// If you need thread safety, use a lock around these
// operations, as well as in your methods that use the resource.
if (!_disposed)
{
if (disposing) {
if (_resource != null)
_resource.Dispose();
Console.WriteLine("Object disposed.");
}
// Indicate that the instance has been disposed.
_resource = null;
_disposed = true;
}
}
Run Code Online (Sandbox Code Playgroud)
不_resource = null应该放在这个代码块里面?如果进行了调用,Dispose(false)那么_resource将为null并且无法随后处理!??
当然, …
我正在开发一个使用Crystal Reports进行报告的应用程序.它在ReportDocument对象中打开一个给定的报告,完成它需要做的事情,然后关闭报告.
using (var report = OpenReport(reportSourceInfo))
{
// Do stuff with the report
report.Close();
}
Run Code Online (Sandbox Code Playgroud)
OpenReport方法对源文件进行一些验证,并返回一个打开的ReportDocument对象.
测试表明,此代码执行了它的目的,并且似乎没有任何问题.我真正建议的问题是当我进行报告项目的代码分析(CA)构建时,我得到以下CA消息:
CA2202:Microsoft.Usage:对象'report'可以在方法'CrystalReportingProvider.ReportExecute(ReportSourceInformation)'中多次处理.为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose.
现在显然我可以改变代码,所以我没有得到这个CA警告,但我的问题是我应该吗?
Crystal Reports ReportDocument.Close()方法是否可以正确处理资源清理?该消息似乎表明Close方法调用Dispose方法,但这似乎不正确.
任何意见,将不胜感激.
我在一个应用程序中使用Quartz.NET.处理Quartz.NET的正确方法是什么?
现在我正在做
if (_quartzScheduler != null)
{
_quartzScheduler = null;
}
Run Code Online (Sandbox Code Playgroud)
这还不够,还是应该在jobType类中实现dispose或者什么?
赛斯
我正在从openfiledialoge中选择文件并将其显示在图片框中,当我点击delete按钮时,它在文本框中显示我正在异常The process cannot access the file because it is being used by another process.
我搜索了很多这个例外以便得到解决,但是当我尝试关闭时,我没有解决任何问题带有imagename的文件,它位于文本框中,即我在图片框中显示的文件; 使用IsFileLocked方法,这会关闭并删除特定目录路径的所有文件,但是如何删除picturebox中显示的唯一文件,我哪里出错了
public partial class RemoveAds : Form
{
OpenFileDialog ofd = null;
string path = @"C:\Users\Monika\Documents\Visual Studio 2010\Projects\OnlineExam\OnlineExam\Image\"; // this is the path that you are checking.
public RemoveAds()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (System.IO.Directory.Exists(path))
{
ofd = new OpenFileDialog();
ofd.InitialDirectory = path;
DialogResult dr = new DialogResult();
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
Image …Run Code Online (Sandbox Code Playgroud) 问题描述:
题
最好的办法是在这里做什么?我们应该吗
请详细说明您的答案。谢谢
public class FooClass : IDisposable
{
private readonly OtherDisposableClass _disposable;
private readonly string _imageSource;
private readonly string _action;
private readonly string _destination;
private bool _isInitialized;
public FooClass(OtherDisposableClass disposable)
{
_disposable = disposable;
}
~FooClass()
{
// Finalizer calls Dispose(false)
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
// Not possible because _disposable is marked readonly
_disposable = null;
}
}
Run Code Online (Sandbox Code Playgroud) 当试图处理UdpClient时,我发现这是不可能的.对于以下内容:
UdpClient udpClient = new UdpClient();
udpClient.Dispose();
Run Code Online (Sandbox Code Playgroud)
Visual Studio显示错误:
由于其保护级别,'System.Net.Sockets.UdpClient.Dispose(bool)'无法访问
这是否意味着我应该继承UdpClient并揭露Dispose(因为似乎是任何实现IDisposable应该被处理的共识)?有什么理由我们不应该直接使用这个类吗?或者在打电话后没有什么可以处理掉的Close?
虽然using声明确实有效 - 但在听时却不合适.
对于大型或高流量网站:
第一个问题:
将设置Object=null(不是Disposable)释放内存?或者是释放记忆的其他方式?
第二个问题:
在正常代码中是否需要显式释放内存?
我一直在寻找这个信息的时间.从来没有见过有人问这样的事情.我知道我们可以在不安全的代码中使用C#中的指针,但事实并非如此.问题是:
MyClass beta = new MyClass();
MyClass alpha = beta;
beta = null;
Run Code Online (Sandbox Code Playgroud)
我现在需要做的是将beta设置为null并且ALSO将alpha设置为null.假设我已经在函数中返回了alpha,所以我再也无法访问它了,所以,我怎样才能将它设置为null?在c ++中,如果beta和alpha是指针我可以释放beta指向的内存,但我不知道在c#中这样做的方法.
以更基本的方式,假设我必须将两个变量都设置为null,但我只能访问其中一个变量.
编辑
我确实看到了一些答案,无法解决我所做的问题......我试着再次解释.我正在创建一个做一些动作效果的类,并返回一个可用于暂停或停止此动作的实例.使用此类的程序员在使用 if(variable != null) 之前用于测试变量.我需要的是当动作超过他们所拥有的实例时变为null,所以他们知道它不再有用了.
这有什么办法吗?
嗨,我有一个对象是Disposable,我想知道什么是更好的:
this.object.Dispose();
Run Code Online (Sandbox Code Playgroud)
要么
this.object = null;
Run Code Online (Sandbox Code Playgroud)
要么
this.object.Dispose();
this.object = null;
Run Code Online (Sandbox Code Playgroud) 所以当我的表单加载时,它将连接到数据库,当我点击按钮时,它会在我的数据库中插入一个新行,但是在我点击它后我没有看到我的表中的任何更改.
namespace database
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SqlConnection con;
private void Form1_Load(object sender, EventArgs e)
{
con = new SqlConnection();
con.ConnectionString =
"Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\myworkers.mdf;Integrated Security=True;User Instance=True";
con.Open();
MessageBox.Show("OPEN!");
}
private void label1_Click(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
int x;
SqlCommand thiscommand = con.CreateCommand();
thiscommand.CommandText =
"INSERT INTO player_info (player_id, player_name) values (10, 'Alex') ";
x = thiscommand.ExecuteNonQuery(); /* I used variable x to verify …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
public class Program
{
private static Task task;
private static int counter = 0;
private static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
if (task == null)
{
Console.WriteLine(++counter);
}
using (task = new Task(Method))
{
task.Start();
task.Wait();
}
// task = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
Console.ReadKey();
}
public static void Method() { }
}
Run Code Online (Sandbox Code Playgroud)
我的例外输出:1 2 3 4 5 6 ...但此方法的实际输出为1!
如果我从代码行中删除注释,Task = null;那么我将成为预期的结果.
为什么处理的任务不为空!?我想,如果对象被处理掉,那么它们可以从GC设置为null(我已经强制GC收集),换句话说GC会收集处理过的(孤儿)对象并将它们置为空?!
c# ×12
.net ×5
dispose ×3
asp.net ×2
idisposable ×2
destructor ×1
memory ×1
pointers ×1
quartz.net ×1
resources ×1
udpclient ×1