-5

我有一个需要以同步方式运行多个实例的 C# winform 应用程序。目标是:

如果 exe 运行 3 次,它将运行 exe 的第一个实例,其余的将等待第一个实例完成处理。然后,下一个等待的 exe 实例将运行和处理,依此类推。

exe 将一个接一个地运行,直到完成处理,然后 exe 将自动终止 af。

知道怎么做吗?

我已经在下面尝试过:

    private void CheckInstance()
            {
                bool _returnValue = true;
                string _lockFile = string.Empty;
                Random _rnd = new Random();

                int _randomValue = _rnd.Next(100, 200);
                int _rndmiliSec = 0;

                _rndmiliSec = DateTime.Now.Millisecond * _rnd.Next(2, 6);

                _lockFile = string.Concat(AppDomain.CurrentDomain.BaseDirectory, string.Format("/{0}", instanceFileName));

                while (_returnValue)
                {
                    _returnValue = File.Exists(_lockFile);

                    if (_returnValue)
                    {
                        Thread.Sleep(1000);
                        this.Hide();
                    }
                    else
                    {
                        try
                        {
                            Thread.Sleep((_rnd.Next(1000) + _rndmiliSec) + _rnd.Next(1000, 1500));
                            Functions.WriteLog(_lockFile, "Starting the process...");
                            Functions.WriteLog(_lockFile, string.Format("Start Time : {0}", paramPrintTime));
                            File.SetAttributes(_lockFile, FileAttributes.ReadOnly);
                            this.Show();
                            break;
                        }
                        catch (Exception)
                        {
                            _returnValue = false;
                        }
                    }
                }
            }

            private void DeleteInstance()
            {
                try
                {
                    File.SetAttributes(string.Concat(AppDomain.CurrentDomain.BaseDirectory, string.Format("/{0}", instanceFileName)), FileAttributes.Normal);
                    File.Delete(string.Concat(AppDomain.CurrentDomain.BaseDirectory, string.Format("/{0}", instanceFileName)));
                }
                catch (Exception)
                {

                }

            }

private void Form_Shown(Object sender, EventArgs e)
        {
            _backWorker.RunWorkerAsync();
        }
private void FormClosed(object sender, FormClosedEventArgs e)
        {
            DeleteInstance();
        }

        private void Form_Load(object sender, System.EventArgs e)
        {
            CheckInstance();
        }

        BackgroundWorker _backWorker = new BackgroundWorker();
public Form()
        {
            InitializeComponent();
            _backWorker.WorkerReportsProgress = true;
            _backWorker.ProgressChanged += _backWorker_ProgressChanged;
            _backWorker.RunWorkerCompleted += _backWorker_RunWorkerCompleted;
            _backWorker.DoWork += _backWorker_DoWork;
        }
 private void _backWorker_DoWork(object sender, DoWorkEventArgs e)
        {
Do some work processing...
}
  private void _backWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.Close();
        }
  private void _backWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            pg.Value = e.ProgressPercentage;
            lblIndicator.Text = e.UserState.ToString();
        }

当 exe 运行 3 个实例时,第一个实例将运行,而第二个和第三个实例会隐藏一段时间,等待第一个实例完成。但是,在第一个实例完成该过程后,第二个和第三个实例同时运行。

有任何想法吗?谢谢。

4

1 回答 1

-1

也许这可以工作:

public static bool IsProgramRunning(string TitleOfYourForm)
{
    bool result = false;
    Process[] processes = Process.GetProcesses();
    foreach (Process p in processes)
    {
         if (p.MainWindowTitle.Contains(TitleOfYourForm))
         {
             result = true;
             break;
         }
    }
    return result;
}

在 Main 函数中调用这个函数(在打开 mainForm 之前),如果它是 false Application.Exit() 否则显示你的表单。如果这个答案对你有帮助,投票给我。

于 2013-10-07T15:27:04.313 回答