C# 如何关闭由另一个线程打开的文件?

C# 如何关闭由另一个线程打开的文件?,c#,C#,我有一个后台线程,它使用image.FromFile加载图像文件,我想从另一个线程关闭打开的图像文件 是否有可能关闭由c#中的后台线程打开的文件 编辑: 我一开始在同一个线程上使用了这段代码,但我不知道为什么我不能释放或删除文件,甚至不能删除我使用img.Save(…)保存的新文件。所以我试图在另一个线程上强制关闭。这就是我问这个问题的原因 var img = Image.FromFile(filepath); img.Save(filepath + ".jpg", ImageFormat.Jp

我有一个后台线程,它使用
image.FromFile
加载图像文件,我想从另一个线程关闭打开的图像文件

是否有可能关闭由c#中的后台线程打开的文件

编辑: 我一开始在同一个线程上使用了这段代码,但我不知道为什么我不能释放或删除文件,甚至不能删除我使用
img.Save(…)
保存的新文件。所以我试图在另一个线程上强制关闭。这就是我问这个问题的原因

var img = Image.FromFile(filepath);
img.Save(filepath + ".jpg", ImageFormat.Jpeg);
img.Dispose();
if (File.Exists(filepath+ ".jpg"))
    File.Delete(+ ".jpg");
if (File.Exists(filepath))
    File.Delete(filepath);
在图像被释放之前,文件不会“关闭”。通过加载包含以下代码段的图像,一步即可立即打开和关闭文件:

System.Drawing.Bitmap image;
using (var fileLoadImage = System.Drawing.Bitmap.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"))
{
    image = new System.Drawing.Bitmap(fileLoadImage);
}
但是,您需要非常小心使用此模式,因为在处理完图像后,仍然必须显式调用
image.Dispose()
。不过,至少这会让您绕过文件锁定

祝你好运

编辑-可运行的代码段

将以下内容复制并粘贴到新的控制台应用程序中,以查看其是否正常工作。在开始之前,请确保示例图片中有一个名为“test.jpg”的文件,您将看到这样做可以很好地删除原始文件和新文件:

public class Program
{
    public static void Main(string[] args)
    {
        System.Drawing.Bitmap image;
        var originalFile = @"C:\Users\Public\Pictures\Sample Pictures\test.jpg";
        var newFile = @"C:\Users\Public\Pictures\Sample Pictures\test2.jpg";
        using (var fileLoadImage = System.Drawing.Bitmap.FromFile(originalFile))
        {
            image = new System.Drawing.Bitmap(fileLoadImage);
        }

        image.Save(newFile);
        System.IO.File.Delete(originalFile);

        image.Dispose();
        System.IO.File.Delete(newFile);
    }
}
在图像被释放之前,文件不会“关闭”。通过加载包含以下代码段的图像,一步即可立即打开和关闭文件:

System.Drawing.Bitmap image;
using (var fileLoadImage = System.Drawing.Bitmap.FromFile(@"C:\Users\Public\Pictures\Sample Pictures\Chrysanthemum.jpg"))
{
    image = new System.Drawing.Bitmap(fileLoadImage);
}
但是,您需要非常小心使用此模式,因为在处理完图像后,仍然必须显式调用
image.Dispose()
。不过,至少这会让您绕过文件锁定

祝你好运

编辑-可运行的代码段

将以下内容复制并粘贴到新的控制台应用程序中,以查看其是否正常工作。在开始之前,请确保示例图片中有一个名为“test.jpg”的文件,您将看到这样做可以很好地删除原始文件和新文件:

public class Program
{
    public static void Main(string[] args)
    {
        System.Drawing.Bitmap image;
        var originalFile = @"C:\Users\Public\Pictures\Sample Pictures\test.jpg";
        var newFile = @"C:\Users\Public\Pictures\Sample Pictures\test2.jpg";
        using (var fileLoadImage = System.Drawing.Bitmap.FromFile(originalFile))
        {
            image = new System.Drawing.Bitmap(fileLoadImage);
        }

        image.Save(newFile);
        System.IO.File.Delete(originalFile);

        image.Dispose();
        System.IO.File.Delete(newFile);
    }
}

这听起来是个很糟糕的主意。为什么需要强制关闭文件?你的线程正在使用它!通常不是这样。在这种情况下,您必须处理图像对象,即使您可以这样做,后台线程也可能不喜欢它。这是一个很少有机会问的问题-为什么需要这样做?任何线程都可以调用图像对象的dispose()方法。联锁以确保没有线程在使用对象取决于您。显示相关代码,可能是您做错了什么。这听起来是一个非常糟糕的主意。为什么需要强制关闭文件?你的线程正在使用它!通常不是这样。在这种情况下,您必须处理图像对象,即使您可以这样做,后台线程也可能不喜欢它。这是一个很少有机会问的问题-为什么需要这样做?任何线程都可以调用图像对象的dispose()方法。联锁以确保没有线程使用对象取决于您。显示相关代码,可能是您做错了什么。我已经更新了问题。请检查一下。我还尝试使用
内存流(File.ReadAllBytes(filepath))但是我也不能删除这个文件,尽管我正在调用Close,然后Dispose,在MemoryStream和我从
image.FromStream
@donfoneseo获得的图像上。我编写了一个示例程序,一切都完全按照预期进行。我将代码粘贴到编辑后的答案中,供您使用。我建议检查应用程序的其他部分是否正在使用该文件。如果您正在启动后台线程,可能有多个线程正在访问同一个文件?不管怎么说,一切都按预期进行!我已经更新了这个问题。请检查一下。我还尝试使用
内存流(File.ReadAllBytes(filepath))但是我也不能删除这个文件,尽管我正在调用Close,然后Dispose,在MemoryStream和我从
image.FromStream
@donfoneseo获得的图像上。我编写了一个示例程序,一切都完全按照预期进行。我将代码粘贴到编辑后的答案中,供您使用。我建议检查应用程序的其他部分是否正在使用该文件。如果您正在启动后台线程,可能有多个线程正在访问同一个文件?不管怎么说,一切都按预期进行!