I wrote program that listens on a directory (GUI - WPF). When the new file show up in this directory is sent to the printer. The problem occurs when I try to save a large file to this directory. I have to wait until the file is closed, and then send it to the printer. I have a function that checks if the file is open. But when I use it in the whole GUI hangs. How do I use this function asynchronously?
 protected void newfile(object fscreated, FileSystemEventArgs Eventocc)
        {
            try
            {
                    string CreatedFileName = Eventocc.Name;
                    FileInfo createdFile = new FileInfo(CreatedFileName);
                    string extension = createdFile.Extension;
                    string eventoccured = Eventocc.ChangeType.ToString();
                    fsLastRaised = DateTime.Now;
                        this.Dispatcher.Invoke((Action)(() =>
                        {
                            String file = "";
                            file = watchingFolder + "\\" + CreatedFileName;                                  
                            //printing
                            this.Dispatcher.Invoke((Action)(() =>
                            {
                                FileInfo info = new FileInfo(file);
                                while (!IsFileReady(info)) { }
                                var t = new Thread(() => printFile(file, extension)); //send to printer
                                t.Start();
                            }));
                        }));
                    }
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show("Error");
            }
        }
IsFileReady function:
 public static bool IsFileReady(FileInfo file)
        {
            FileStream stream = null;
            try
            {
                stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
            }
            catch (IOException)
            {
                //the file is unavailable because it is:
                //still being written to
                //or being processed by another thread
                //or does not exist (has already been processed)
                return true;
            }
            finally
            {
                if (stream != null)
                    stream.Close();
            }
            //file is not locked
            return false;
        }
And printfile
 public void printFile(string filepath, string ext)
        {
                    ProcessStartInfo info = new ProcessStartInfo();
                    info.Verb = "print";
                    info.FileName = filepath;
                    info.CreateNoWindow = true;
                    info.WindowStyle = ProcessWindowStyle.Hidden;
                    Process p = new Process();
                    p.StartInfo = info;
                    p.Start();
                    p.WaitForInputIdle();
                    System.Threading.Thread.Sleep(3000);
                    if (false == p.CloseMainWindow())
                        p.Kill();
                }
        }
How can I correct this code to work with large files without hangs up?
EDIT:
For check new file I use FileSystemWatcher
private void start(object sender, RoutedEventArgs e)
        {
            if (watchingFolder == null)
            {
            }
            else
            {
                fs = new FileSystemWatcher(watchingFolder, "*.*");
                fs.EnableRaisingEvents = true;
                fs.IncludeSubdirectories = true;
                fs.Created += new FileSystemEventHandler(newfile);
                btnSatrt.IsEnabled = false;
                btnStop.IsEnabled = true;
            }
        }
 
     
     
    