使用从WinForms启动进程启动的程序共享冲突

时间:2014-10-31 01:15:58

标签: .net multithreading winforms

我试图通过在WinForms应用程序中使用ProcessStart来启动文件的编辑程序,从而为客户提供编辑网络驱动器上的图像文件的能力。它可以很好地启动图像编辑程序;但是,它不允许他们保存更改,从而导致错误:

A sharing violation occurred while accessing [File location and Name].

如果我保持启动的编辑应用程序打开并关闭启动编辑器然后尝试保存更改的WinForms应用程序,它允许在100%的时间内保存更改而不会出现问题。我相信ProcessStart实际上没有在解耦的线程中启动进程,我尝试使用新线程启动编辑应用程序,这导致了相同的情况。如何从WinForms应用程序启动编辑程序作为独立的,解耦的程序,以便用户可以在不关闭WinForms应用程序的情况下保存更改?我很欣赏任何关于我不做或不考虑作为一种选择的见解。

这是我打电话来启动编辑程序的方法。 ProcessExe是用户计算机上编辑程序的名称,workingDirectory与网络文件位置的值相同,args是fileLocation和Name

    public static void RunProcess(string ProcessExe, string workingDirectory, params string[] args)
    {
        Process myProcess = new Process();
        try
        {
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.Arguments = HelperFunctions.EscapeArguments(args); //format the arguments correctly.
            startInfo.CreateNoWindow = false;
            startInfo.FileName = App.Shared.HelperFunctions.FindExePath(ProcessExe); //Name of the program to be opened
            //Tried setting the working directory to %USERPROFILE%\Documents and no difference
            startInfo.WorkingDirectory = workingDirectory;
            startInfo.RedirectStandardError = false;
            startInfo.RedirectStandardInput = false;
            startInfo.RedirectStandardOutput = false;
            startInfo.UseShellExecute = true;
            myProcess.StartInfo = startInfo;
            //myProcess.Start(); //Tried this straight forward method call and it failed
            //Tried to use a new thread
            Thread thread = new Thread(new ThreadStart(delegate { myProcess.Start(); }));
            //Tried without setting the apartment state, and setting as MTA and STA with the same result
            thread.TrySetApartmentState(ApartmentState.STA);
            thread.Start();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

致电代码:

    private void pbxImage_ButtonClick(object sender, EventArgs e)
    {
        try
        {
            string strImageNum = BDL.Data["ImageNumber"].ToString();
            string strDirectory = ConfigurationManager.AppSettings["ImageLocation"];
            string fileName = string.Empty;
            fileName = string.Format("{0}\\{1}{2}", strDirectory, strImageNum, ".jpg");
            HelperFunctions.RunProcess("mspaint.exe", strDirectory, fileName);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

我使用了VDohnal(stackoverflow.com/a/20623302/2224701)中的代码,并验证了图像文件实际上已被主机WinForms应用程序锁定。

1 个答案:

答案 0 :(得分:0)

感谢Garth J. Lancaster。 Garth指出我正在使用Picture.Load(文件)在WinForms应用程序中显示图像。这样做的行为锁定了图像文件;因此,当我尝试使用单击事件将图像文件打开到MS Paint时,文件已被锁定,从而创建共享条件。解决方案是从图像文件中的byte []创建一个位图,并使用Picture.Image = bitmap。我不知道Picture.Load()在源图像文件上创建了一个锁。