多线程和C#异常。文件正由另一个进程使用

时间:2016-02-13 20:56:39

标签: c# multithreading file locking

我正在编写一个应用程序,其中一个其他Window窗体应用程序将写入该文件,然后我的文件将读取该文件并执行一些任务,这将花费大约2小时的时间。所以我想实现线程,这样每当文件长度大于零时,我的应用程序应该启动一个线程,然后主线程应该开始寻找文件大小,如果再次在一段时间内文件的长度变得大于零,那么主线程应该是为此完成单独的线程。一旦任务完成,就应该停止。

请建议我如何实现这一目标,并查看我的代码如下:

窗体申请代码:

const string inputfile=@"C:\Users\abc\Documents\input.txt";
        try {
                using (FileStream fs = File.Open(inputfile, FileMode.Open))
                {
                    using (StreamWriter writer = new StreamWriter(fs))
                    {
                        writer.Write(textBox1.Text);
                        button1.Enabled = false;
                        writer.Close();
                        fs.Close();
                    }

                }

            }
        catch(Exception ex)
        {
            MessageBox.Show("File is locked by some process try again");
            Thread.Sleep(10*1000);
            Application.Exit();
        }

我的申请代码:

    static void Main(string[] args)
    {

        while(true)
        {
            FileInfo fi = new FileInfo(inputfile);
                if(fi.Length>0)
                {
                    Thread th1=new Thread(new ThreadStart(ThreadingTest.runCommand));
                    th1.Start();
                    if(Variable.stop)
                    th1.Abort();

                }
                else
                {
                    Console.WriteLine("File.Empty");
                    Thread.Sleep(30 * 1000);
                }
        }

当我运行我的应用程序时,我得到一个异常" C#异常。文件正由另一个进程使用"请提出一些关于我的方法的有用的观点。

2 个答案:

答案 0 :(得分:0)

您可以使用FileSystemWatcher通过订阅onChanged事件来监视该文件,而不是在循环中执行此操作。您可以在此处找到一些文档和示例:https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx

该文件可能仍被其他进程锁定,因此请尝试打开该文件直至其解锁:

while(true)
{
     try {
            /* open and process file */
            break;
     }
     catch(Exception e)
     {
            /* file unavailable */
     }

     Thread.Sleep(100); // Wait for the file to be available
}

答案 1 :(得分:0)

首先,您不想使用Thread.Abort()。其次,如果您可以修改文件创建应用程序,请告知您文件已准备就绪(通过创建另一个文件作为标记或释放已命名的互斥锁或通过远程处理或wcf ...)。或者让应用程序每次都创建一个新文件(具有唯一名称)。

如果无法进行此类修改,则必须使用文件锁作为同步机制。这意味着只需尝试反复打开它,并希望你不要错过文件创建应用程序再次锁定之前的时间。