C# 执行会毫无例外地停止
我有一些代码,可以使用在客户端计算机上运行的服务通过网络删除用户配置文件,如下所示:C# 执行会毫无例外地停止,c#,C#,我有一些代码,可以使用在客户端计算机上运行的服务通过网络删除用户配置文件,如下所示: public static void DeleteProfiles() { ConsoleWrapper.WriteLine("We're in DeleteProfiles()"); try { string[] users = GetUsers(); ConsoleWrapper.WriteLine("Users gotten");
public static void DeleteProfiles()
{
ConsoleWrapper.WriteLine("We're in DeleteProfiles()");
try
{
string[] users = GetUsers();
ConsoleWrapper.WriteLine("Users gotten");
if (users == null || users.Length == 0)
{
DeletingProfiles = false;
ConsoleWrapper.WriteLine("Null or no user loaded");
return;
}
DirectoryInfo oInfo = new DirectoryInfo("C:/Users");
if (!oInfo.Exists)
oInfo = new DirectoryInfo("C:/Documents and Settings");
ConsoleWrapper.WriteLine("Profile folder gotten.");
ConsoleWrapper.WriteLine("User Directory: " + oInfo.FullName);
ConsoleWrapper.WriteLine("\nDirectories to be deleted:");
DirectoryInfo[] SubDirectories = oInfo.GetDirectories();
foreach (DirectoryInfo oSubDir in SubDirectories)
{
bool match = false;
foreach (string user in users)
{
if (user == null)
continue;
if (oSubDir.Name.ToLower() == user.ToLower())
{
ConsoleWrapper.WriteLine("Matched: " + oSubDir.FullName);
match = true;
break;
}
}
if (match)
continue;
try
{
ConsoleWrapper.WriteLine(oSubDir.FullName);
DeletePath(oSubDir.FullName);
}
catch (Exception ex)
{
ConsoleWrapper.WriteLine(ex.StackTrace);
}
}
}
catch (Exception dirEx)
{
ConsoleWrapper.WriteLine(dirEx.Message);
}
}
ConsoleWrapper中的WriteLine方法实际上将数据附加到txt文件中,因为这是我想到的在不同机器上调试的最简单方法
当我在命令行应用程序中使用它时,这段代码确实有效,但当我尝试在Windows服务中使用它时,它只会写“我们在DeleteProfiles()中”。正如您所注意到的,我捕获了每个“可捕获”的异常,但我仍然不明白发生了什么
所有的客户端计算机都出现了这个问题,但它在我的台式机和笔记本电脑上都能正常工作。我做错了什么
有关DeletePath代码,请参见。实际上,我将其提升并转换为C代码。如果捕获了每个可捕获的异常,但在日志中没有看到条目,则很可能抛出了一个不可捕获的异常。这通常以StackOverflowException的形式出现。默认情况下,进程无法捕获此类异常
如果DeletePath是一个递归函数,请尝试使其迭代,看看这是否解决了问题。如果捕获了每个可捕获的异常,但在日志中没有看到条目,则很可能抛出了一个不可捕获的异常。这通常以StackOverflowException的形式出现。默认情况下,进程无法捕获此类异常
如果DeletePath是一个递归函数,请尝试使其迭代,看看这是否解决了问题。可能您没有刷新ConsoleWrapper。尝试在finally块中进行刷新,或打开自动刷新。可能您没有刷新ConsoleWrapper。尝试在finally块中放置刷新,或打开自动刷新。GetUsers()做什么 这可能需要很长时间吗 如何从服务中调用DeleteProfiles() 如果直接从ServiceBase.OnStart()的重写调用DeleteProfiles(),则需要知道OnStart()在30秒后超时。GetUsers()的作用是什么 这可能需要很长时间吗 如何从服务中调用DeleteProfiles()
如果您直接从ServiceBase.OnStart()的重写调用DeleteProfiles(),则需要知道OnStart()在30秒后超时。如果您无法理解,请将其放在客户端上并连接到它。您可能需要在方法的顶部放置一个Thread.Sleep(),以便有足够的时间在客户端的进程列表中查找服务进程,并在服务进程实际运行时将其连接。如果您无法找到,请在客户端上放置并连接。您可能需要在方法的顶部放置一个Thread.Sleep(),这样您就有足够的时间在客户端的进程列表中查找服务进程,并在它实际运行时将其连接。从日志记录的角度来看,我会使用一个众所周知的库,如log4net或Microsoft的日志记录应用程序块。当您滚动自己的日志记录时,请确保调用Flush()以清除任何bufferred写入。我发现log4net更容易合并到现有代码中,除非您已经是一家企业库商店。从日志记录的角度来看,我会使用众所周知的库,如log4net或Microsoft的日志记录应用程序块。当您滚动自己的日志记录时,请确保调用Flush()以清除任何bufferred写入。我发现,除非您已经是一家企业图书馆商店,否则log4net更容易合并到现有代码中。服务需要额外的安全措施才能与桌面交互。此处有一个安装程序可为您提供:
服务需要额外的安全措施才能与桌面交互。此处有一个安装程序可为您提供:
DeletePath调用递归函数SetAttributes。实际上,我拥有的是DeletePath调用递归函数SetAttributes的代码的C#副本。我所拥有的实际上是代码的C#副本,我的第一个猜测是,这与安全性有关。我的第二个猜测是检查配置/环境。我的第一个猜测是这与安全性有关。我的第二个猜测是检查配置/环境。谢谢。问题出在GetUsers()上。谢谢。问题出在GetUsers()上。谢谢。这很有帮助。我在代码中添加了注册表调用。谢谢。这很有帮助。我在代码中添加了注册表调用。