我正试图在我的应用程序(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
干杯,
赛斯