相关疑难解决方法(0)

在C#中使用IDisposable与析构函数有什么区别?

我何时在类上实现IDispose而不是析构函数?我读过这篇文章,但我仍然忽略了这一点.

我的假设是,如果我在一个对象上实现IDispose,我可以显式"破坏"它,而不是等待垃圾收集器这样做.它是否正确?

这是否意味着我应该总是在对象上显式调用Dispose?这有什么常见的例子?

.net c# dispose destructor

95
推荐指数
5
解决办法
5万
查看次数

MSDN Dispose()示例错误?(何时将托管引用设置为null)

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并且无法随后处理!??

当然, …

c#

12
推荐指数
1
解决办法
2279
查看次数

清理Crystal Reports ReportDocument对象使用的资源的最佳方法是什么?

我正在开发一个使用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方法,但这似乎不正确.

任何意见,将不胜感激.

c# code-analysis idisposable crystal-reports reportdocument

11
推荐指数
1
解决办法
4822
查看次数

处理Quartz.NET的正确方法?

我在一个应用程序中使用Quartz.NET.处理Quartz.NET的正确方法是什么?

现在我正在做

    if (_quartzScheduler != null)
    {
        _quartzScheduler = null;
    }
Run Code Online (Sandbox Code Playgroud)

这还不够,还是应该在jobType类中实现dispose或者什么?

赛斯

.net c# quartz.net

10
推荐指数
1
解决办法
3030
查看次数

删除图片框中显示的文件

我正在从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)

c# asp.net

9
推荐指数
1
解决办法
7276
查看次数

如果对象是IDisposable类的字段,我们是否应该将对象标记为只读

问题描述:

  1. 我有一个实现IDisposable的类(FooClass),该类将另一个一次性对象(OtherDisposableClass)用作其构造函数的参数。
  2. 我创建一个OtherDisposableClass的实例
  3. 我创建FooClass的实例并将实例OtherDisposableClass传递给它
  4. OtherDisposableClass的实例不应是可变的,因此我将其标记为只读
  5. 我无法在我的Dispose方法中摆脱对OtherDisposableClass实例的引用

最好的办法是在这里做什么?我们应该吗

  1. 不会将OtherDisposableClass的实例标记为只读,因此我们可以在Dispose方法中将其设置为“ null”
  2. 将OtherDisposableClass标记为只读,并且不要再次删除对其的引用。
  3. 还有别的

请详细说明您的答案。谢谢

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)

c# idisposable

5
推荐指数
1
解决办法
1530
查看次数

是否应该处理UdpClient?

当试图处理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声明确实有效 - 但在听时却不合适.

.net c# resources dispose udpclient

5
推荐指数
1
解决办法
3766
查看次数

是否有必要通过在c#中将obj设置为null来释放内存?

可能重复:
在.NET中使用后将对象设置为Null/Nothing
您是否需要处理对象并将其设置为null?

对于大型或高流量网站:

第一个问题:

将设置Object=null(不是Disposable)释放内存?或者是释放记忆的其他方式?

第二个问题:

在正常代码中是否需要显式释放内存?

c# memory asp.net

3
推荐指数
1
解决办法
3554
查看次数

在c#中设置null引用

我一直在寻找这个信息的时间.从来没有见过有人问这样的事情.我知道我们可以在不安全的代码中使用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,所以他们知道它不再有用了.

这有什么办法吗?

c# pointers memory-management

3
推荐指数
1
解决办法
3642
查看次数

c#object.Dispose()或object = 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)

.net c# dispose

3
推荐指数
1
解决办法
5335
查看次数

无法在C#sql数据库中插入数据

所以当我的表单加载时,它将连接到数据库,当我点击按钮时,它会在我的数据库中插入一个新行,但是在我点击它后我没有看到我的表中的任何更改.

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)

c#

2
推荐指数
1
解决办法
906
查看次数

编译器是否将已处置的对象设置为null?

我有以下代码:

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会收集处理过的(孤儿)对象并将它们置为空?!

.net c# garbage-collection

2
推荐指数
1
解决办法
91
查看次数