我正试图在我的应用程序(c,ms.net 4.0)中使用NGit library。在MS平台上,我在VS2010下重新构建了.NETFramework4.0的NGIT。大多数事情都很好,所有功能都很好,但应用程序在关闭时挂起。VSDebugger显示,来自sharpen lib的一些线程无限期地处于等待状态,没有人发出关闭的信号。当我使用NGit.Api.Git类的任何实例方法时(对于静态方法,一切似乎都正常)。有人经历过这样的问题吗?有什么建议吗?
使用Git类的代码示例:

Git myrepo = Git.Init().SetDirectory(@"C:\myrepo.git").SetBare(true).Call();
FetchResult fetchResult = myrepo.Fetch()
    .SetProgressMonitor(new TextProgressMonitor())
    .SetRemote(@"C:\projects\initialrepo")
    .SetRefSpecs(new RefSpec("refs/heads/master:refs/heads/master"))
    .Call();
//
// Some other work...
//
myrepo.GetRepository().Close();

这里是挂线的地方:
类别Sharpen.ThreadExecutor,下面第9行(St.Monitor.Wait (pendingTasks)):
public void RunPoolThread ()
{
    while (!IsTerminated ()) {
        try {
            Runnable r = null;
            lock (pendingTasks) {
                freeThreads++;
                while (!IsTerminated () && pendingTasks.Count == 0)
                    ST.Monitor.Wait (pendingTasks);
                if (IsTerminated ())
                    break;
                r = pendingTasks.Dequeue ();
            }
            if (r != null)
                r.Run ();
        }
        catch (ST.ThreadAbortException) {
            ST.Thread.ResetAbort ();
        }
        catch {
        }
    }
}

最佳答案

我拿到了图书馆并进行了测试。我发现一些相关的测试间歇性地失败了。我不知道测试用例是错的,还是有实际的问题。
我在这里报告了这个问题:https://github.com/slluis/ngit/issues/8
我会看看你添加的特定代码,我刚刚看到
我在上测试了以下代码
Linux(单声道2.6.7,.NET 3.5)
Linux(单声道2.11,.net 4.0)
问题似乎是静态BatchingProgressMonitor(也在不注册TextProgressMonitor时构造)永远不会被“破坏”,这意味着带有关联线程池的AlarmQueue永远不会被Shutdown
如果将以下公共方法添加到类中:

public static void ShutdownNow()
{
    alarmQueue.ShutdownNow();
}

在退出应用程序之前,您可以通过调用BatchingProgressMonitor来“解决问题”。这个工作形式。示例代码显示了在删除BatchingProgressMonitor.ShutdownNow()时如何执行此操作。
是的。
using System;
using NGit;
using NGit.Api;
using NGit.Transport;

namespace Stacko
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Git myrepo = Git.Init().SetDirectory(@"/tmp/myrepo.git").SetBare(true).Call();
            {
                var fetchResult = myrepo.Fetch()
                    .SetProgressMonitor(new TextProgressMonitor())
                    .SetRemote(@"/tmp/initial")
                    .SetRefSpecs(new RefSpec("refs/heads/master:refs/heads/master"))
                    .Call();
                //
                // Some other work...
                //
                myrepo.GetRepository().Close();
            }
            System.GC.Collect();

#if false
            System.Console.WriteLine("Killing");
            BatchingProgressMonitor.ShutdownNow();
#endif
            System.Console.WriteLine("Done");

        }
    }
}

我也会在问题追踪上报告。编辑完成:here
干杯,
赛斯

08-27 17:15