C# “为什么?”;类型为';的未处理异常;System.IO.IOException';发生在mscorlib.dll中(被某些.exe锁定)";发生了什么?

C# “为什么?”;类型为';的未处理异常;System.IO.IOException';发生在mscorlib.dll中(被某些.exe锁定)";发生了什么?,c#,multithreading,excel,C#,Multithreading,Excel,其他信息:进程无法访问文件“E:\Data.xls”,因为它正被其他进程使用 我是c#方面的新手,尝试将一些数据保存到.xls文件中,该文件逐个收集来自五个图像帧的数据,然后将其保存到.xls文件中。但我总是遇到麻烦 中发生类型为“System.IO.IOException”的未处理异常 mscorlib.dll其他信息:进程无法访问 文件“E:\Data.xls”,因为它正被另一个进程使用 我在SO上发现了很多这样的问题,但无法解决问题。这是我的密码: string path = @"E:\D

其他信息:进程无法访问文件“E:\Data.xls”,因为它正被其他进程使用

我是c#方面的新手,尝试将一些数据保存到.xls文件中,该文件逐个收集来自五个图像帧的数据,然后将其保存到.xls文件中。但我总是遇到麻烦

中发生类型为“System.IO.IOException”的未处理异常 mscorlib.dll其他信息:进程无法访问 文件“E:\Data.xls”,因为它正被另一个进程使用

我在SO上发现了很多这样的问题,但无法解决问题。这是我的密码:

string path = @"E:\Data.xls";
if (!File.Exists(path))
{
    File.Create(path);
    File.Create(path).Dispose();
}

StringBuilder sb = new StringBuilder();
sb.AppendLine(x + "\t" + y + "\t" + pixel1.R + "\t" + pixel1.G + "\t" + pixel1.B);

sb.AppendLine(x+1 + "\t" + y + "\t" + pixel2.R + "\t" + pixel2.G + "\t" + pixel2.B);

sb.AppendLine(x + "\t" + Convert.ToInt32(y+1) + "\t" + pixel3.R + "\t" + pixel3.G + "\t" + pixel3.B);
sb.AppendLine(x+1 + "\t" +Convert.ToInt32(y+1) + "\t" + pixel4.R + "\t" + pixel4.G + "\t" + pixel4.B);
sb.AppendLine(x-1 + "\t" +Convert.ToInt32(y) + "\t" + pixel5.R + "\t" + pixel5.G + "\t" + pixel5.B);
sb.AppendLine(x + "\t" + Convert.ToInt32(y - 1) + "\t" + pixel6.R + "\t" + pixel6.G + "\t" + pixel6.B);
sb.AppendLine(x-1 + "\t" +Convert.ToInt32(y-1) + "\t" + pixel7.R + "\t" + pixel7.G + "\t" + pixel7.B);
sb.AppendLine(x-1 + "\t" + Convert.ToInt32(y+1) + "\t" + pixel8.R + "\t" + pixel8.G + "\t" + pixel8.B);
sb.AppendLine(x+1 + "\t" + Convert.ToInt32(y-1) + "\t" + pixel9.R + "\t" + pixel9.G + "\t" + pixel9.B);
sb.AppendLine(x+2 + "\t" + y + "\t" + pixel10.R + "\t" + pixel10.G + "\t" + pixel10.B);
sb.AppendLine(x + "\t" + Convert.ToInt32(y+2) + "\t" + pixel11.R + "\t" + pixel11.G + "\t" + pixel11.B);
sb.AppendLine(x+2 + "\t" + Convert.ToInt32(y+2) + "\t" + pixel12.R + "\t" + pixel12.G + "\t" + pixel12.B);
sb.AppendLine(x-2 + "\t" + y + "\t" + pixel13.R + "\t" + pixel13.G + "\t" + pixel13.B);
sb.AppendLine(x + "\t" + Convert.ToInt32(y-2) + "\t" + pixel14.R + "\t" + pixel14.G + "\t" + pixel14.B);
sb.AppendLine(x-2 + "\t" + Convert.ToInt32(y-2) + "\t" + pixel15.R + "\t" + pixel15.G + "\t" + pixel15.B);
sb.AppendLine(x-2 + "\t" + Convert.ToInt32(y+2) + "\t" + pixel16.R + "\t" + pixel16.G + "\t" + pixel16.B);
sb.AppendLine(x+2 + "\t" + Convert.ToInt32(y-2) + "\t" + pixel17.R + "\t" + pixel17.G + "\t" + pixel17.B);
sb.AppendLine(x+2 + "\t" + Convert.ToInt32(y+1) + "\t" + pixel18.R + "\t" + pixel18.G + "\t" + pixel18.B);
sb.AppendLine(x+1 + "\t" + Convert.ToInt32(y+2) + "\t" + pixel19.R + "\t" + pixel19.G + "\t" + pixel19.B);
sb.AppendLine(x+2 + "\t" + Convert.ToInt32(y+2) + "\t" + pixel20.R + "\t" + pixel20.G + "\t" + pixel20.B);
sb.AppendLine(x-2 + "\t" + Convert.ToInt32(y-1) + "\t" + pixel21.R + "\t" + pixel21.G + "\t" + pixel21.B);
sb.AppendLine(x-1 + "\t" + Convert.ToInt32(y-2) + "\t" + pixel22.R + "\t" + pixel22.G + "\t" + pixel22.B);
sb.AppendLine(x+2 + "\t" + Convert.ToInt32(y-1) + "\t" + pixel23.R + "\t" + pixel23.G + "\t" + pixel23.B);
sb.AppendLine(x-1 + "\t" + Convert.ToInt32(y+2) + "\t" + pixel24.R + "\t" + pixel24.G + "\t" + pixel24.B);
sb.AppendLine(x-2 + "\t" + Convert.ToInt32(y+1) + "\t" + pixel25.R + "\t" + pixel25.G + "\t" + pixel25.B);
File.AppendAllText(path, sb.ToString());
sb.Clear();
此外,当我试图呈现一个webbrowser控件时,我遇到了另一个异常,如下所示:

webForm frm = new webForm();
frm.Show();
“System.Threading.ThreadStateException”类型的未处理异常 在System.Windows.Forms.dll webbrowser控件中发生


任何关于如何修复这些问题或我在这里做错了什么的建议都将不胜感激。

您打开文件两次,这将导致
IOException

            if (!File.Exists(path))
            {
                // REMOVE this line: File.Create(path);
               File.Create(path).Dispose();
            }

作为理查德,我在想这个

        if (!File.Exists(path))
        {
            // REMOVE this line: File.Create(path);
           File.Create(path).Dispose();
        }
代码块导致错误。因此,这可能会解决您的问题:

if (!File.Exists(path))
{
    var file = File.Create(path);
    file.Dispose();
}

File.Create
创建文件,然后返回可用于写入文件的流。到只要该流存在,文件就会打开

在您的代码中

File.Create(path);
File.Create(path).Dispose();
// snip
File.WriteAllText(..);
它会打开文件三次,但只关闭一次

更好的方法是使用
using
语句来管理流的生命周期:

using(var fileStream = File.Create(path)) // Using automatically closes the stream when it goes out of scope, the scope is defined by the accolades
{
    // You can then use a stream writer to write to the file stream directly
    using(var streamWriter = new StreamWriter(fileStream))
    {
        streamWriter.WriteLine(x + "\t" + y + "\t" + pixel1.R + "\t" + pixel1.G + "\t" + pixel1.B);
        // Etc..
    }
}
如果文件已经存在,则可以执行大致相同的操作

if(File.Exist(path))
{
    using(var fileStream = File.OpenWrite(path))
    {
        // same as before
    }
}

使用这种技术不容易出错。当然,如果另一个程序打开了文件,
IOException
仍然会发生。

每个问题有一个“问题”。@user2864740:你能给第一个问题提些建议吗?这些都是基本的问题。您获得IOException是因为您正在尝试编写已由另一个进程打开的文件。可能会很出色。您必须友好地请求用户关闭它。ThreadStateException是一个编程错误,您试图在不提供用户界面的程序中显示web浏览器。可能是控制台模式的应用程序。请改用Windows窗体或WPF项目模板,或者。@Hans Passant:我得到了关于web浏览器控件的信息,您说得对……是否有任何方法可以检查该文件是否正在被其他进程使用,以便我可以关闭它……当然,您会得到例外。抓住它。你不能关闭这个过程,这太疯狂了。你必须善意地问。这没有帮助…程序在这一行崩溃..“File.AppendAllText(path,sb.ToString());”什么是
异常
?System.IO.\uu Error.WinIOError(Int32 errorCode,String maybeFullPath)