C# 特定的用户操作触发git提交。如何防止同一目录上的多个操作未锁定和抛出错误?

C# 特定的用户操作触发git提交。如何防止同一目录上的多个操作未锁定和抛出错误?,c#,git,libgit2sharp,C#,Git,Libgit2sharp,我有一个应用程序,它使用libgit2sharp在后台执行一些git操作。当用户执行特定操作时,会触发git提交。用户可以快速多次单击按钮,同时触发多个提交。发生这种情况时,有时会出现以下错误之一: 索引被锁定;这可能是由于并发或崩溃的进程造成的 LibGit2Sharp.LockedFileException:无法创建锁定的文件 预防这种情况的正确方法是什么?导致此问题的代码如下所示: using (Repository repo = new Repository(workingDirecto

我有一个应用程序,它使用libgit2sharp在后台执行一些git操作。当用户执行特定操作时,会触发git提交。用户可以快速多次单击按钮,同时触发多个提交。发生这种情况时,有时会出现以下错误之一:

索引被锁定;这可能是由于并发或崩溃的进程造成的
LibGit2Sharp.LockedFileException:无法创建锁定的文件

预防这种情况的正确方法是什么?导致此问题的代码如下所示:

using (Repository repo = new Repository(workingDirectory))
{    
            var stat = repo.RetrieveStatus();
            if (!stat.IsDirty)
            {
                return;
            }

            Commands.Stage(repo, "*");

            Signature committer = new Signature(email, email, DateTime.UtcNow);
            repo.Commit("commit!", committer, committer);
}

有什么方法可以检查锁是否已经存在并等待?有更好的模式吗?

在第一个命令完成之前,您需要某种方法来限制额外的按键。有许多可能的方法可以做到这一点,但仅仅是显示的代码并不能提供足够的信息来完全回答-修复需要在您称之为此例程的位置

决定是否要在命令执行过程中忽略额外的按键,或者是否要对它们进行排队(保存它们并在原始命令完成后按顺序执行它们)。为了简单起见,基于这是多个压力机,我可能会开始忽略额外的压力机。另一个选项是在按下键后停用该键,直到命令完成


如果你想不出一个方法来获得提交完成的反馈,那么一个让事情暂时工作的黑客方法就是在上面放一个计时器,并在计时器完成之前删除多个命令——可能是5秒左右?但是,如果用户当前正在使用该产品,那么这应该是一个快速解决方案,同时您可以找到一个更持久的解决方案。

最正确的方法是将事件接收和处理分开。在事件上,不要调用处理程序-只需将收到的事件放入队列。从队列中逐个分离进程(或线程)处理事件。