2017-09-27 3 views
1

libgit2sharp를 사용하여 백그라운드에서 일부 git 작업을 수행하는 앱이 있습니다. 사용자가 특정 동작을 수행하면 git commit이 실행됩니다. 사용자가 버튼을 여러 번 빠르게 클릭하여 동시에 여러 커밋을 트리거 할 수 있습니다. 이 경우, 언젠가는 이러한 오류 중 하나가 발생합니다특정 사용자 작업이 git commit을 트리거합니다. 같은 디렉토리에있는 여러 작업이 잠기지 않고 오류가 발생하지 않도록하려면 어떻게합니까?

the index is locked; this might be due to a concurrent or crashed process LibGit2Sharp.LockedFileException: failed to create locked file

이를 방지하는 올바른 방법은 무엇입니까? 이 문제를 일으키는 코드는 다음과 같습니다

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); 
} 

내가 잠금이 이미 존재하는 경우 확인하고 기다릴 수있는 몇 가지 방법이 있나요? 더 좋은 패턴이 있습니까?

+1

가장 올바른 방법은 이벤트 수신과 처리를 분리하는 것입니다. 이벤트에서 처리기를 호출하지 마십시오. 단지 수신 된 이벤트를 대기열에 넣으십시오. 프로세스 또는 스레드 프로세스 이벤트를 하나씩 큐에서 분리합니다. – phd

답변

1

첫 번째 명령이 완료 될 때까지 추가 키 누르기를 제한 할 수있는 방법이 필요합니다. 이를 수행하는 방법은 여러 가지가 있지만 표시된 코드만으로는 완전히 대답 할 수있는 정보가 충분하지 않습니다.이 루틴을 호출 할 시점에 수정해야합니다.

명령이 진행중인 동안 여분의 키 누르기를 무시할 것인지 또는 대기열에 넣을 것인지 (원래 명령이 완료된 후 순서대로 저장하고 실행할지 여부)를 결정하십시오. 단순함을 위해서, 그리고 이것이 다중 프레스에 기초하여, 아마 여분의 프레스를 무시하기 시작할 것입니다. 또 다른 옵션은 키를 누른 후 명령이 완료 될 때까지 키를 비활성화하는 것입니다.

커밋 완료에 대한 피드백을 얻을 수있는 방법을 찾지 못하면 임시로 작업하는 해킹 방법은 타이머를 넣고 타이머가 완료 될 때까지 여러 명령을 놓는 것입니다. 어쩌면 5 초 정도? 그러나 더 영구적 인 솔루션을 찾는 동안 사용자가 현재 제품을 사용하고 있다면 신속하게 해결해야합니다.