C# 为什么我的程序在从套接字回调调用函数时挂起?
我试图从套接字回调函数访问集合类型(ModuleManager.cs)的包装器。每当客户机连接到此套接字时,我希望它提供一些关于自身的数据,以便将它和它的套接字放入ModuleManagerC# 为什么我的程序在从套接字回调调用函数时挂起?,c#,sockets,singleton,C#,Sockets,Singleton,我试图从套接字回调函数访问集合类型(ModuleManager.cs)的包装器。每当客户机连接到此套接字时,我希望它提供一些关于自身的数据,以便将它和它的套接字放入ModuleManager private static void AddModule (StateObject state) { string[] ModuleInfo = state.sb.ToString().Split('|'); // Create the module object
private static void AddModule (StateObject state)
{
string[] ModuleInfo = state.sb.ToString().Split('|');
// Create the module object.
Module module = new Module();
module.Socket = state.workSocket;
module.Name = ModuleInfo[0];
module.Plugin = PluginManager.PluginManager.Current.GetPlugin(ModuleInfo[1].Substring(0, ModuleInfo[1].Length - 5));
File.AppendAllText(@"C:\log.txt", System.DateTime.Now.ToString() + " -> [ModuleFinder] Adding module : " + state.sb.ToString() + Environment.NewLine);
ModuleManager.Current.Add(module);
}
因此,创建模块的数据基本上在stringbuilder状态中。创建模块,然后将其添加到模块管理器:
public void Add(Module module)
{
File.AppendAllText(@"C:\log.txt", System.DateTime.Now.ToString() + " -> [ModuleManager] Adding Module: " + module.Name + " | " + module.Plugin.Name + Environment.NewLine);
if (ModuleManager.Current.GetModule(module.Name) == null && PluginManager.PluginManager.Current.GetPlugin(module.Plugin) != null)
{
Modules.Add(module);
File.AppendAllText(@"C:\log.txt", System.DateTime.Now.ToString() + " -> [ModuleManager] Added Module: " + module.Name + " | " + module.Plugin.Name + Environment.NewLine);
}
}
正如您可能已经注意到的,在这个过程中创建了一个日志文件,因为最后一个日志从未被追加,所以我得出结论,程序被卡住了
Modules.Add(module)
但我不知道为什么。当我检查WebApp是否有注册模块时,没有结果
git上的完整项目:
任何帮助都将不胜感激,提前感谢 好的,找到问题了。我没有在不同的线程上监听模块,所以出现了一些奇怪的行为。对不起,这个模糊的问题。我只是不能按我想要的方式来表达。什么是
ModuleManager.Current.GetModule(module.Name)
正在做什么?可以在应用程序域中共享单例;如果您的项目都加载到同一应用程序域中,则它们可以共享同一个单例。但不清楚你的问题到底是什么。相反,您似乎正在尝试调试程序中的挂起。但是,如果没有一个可靠地重现问题的好程序,我怀疑有多少好的帮助是可能的,更不用说提供帮助了。@Rob,我检查一下以前是否注册过同名的模块。@Peter Duniho,我知道我对这个问题不太清楚。但那是因为我自己也不太明白这个问题。由于某种原因,当我调试ModuleManager.Add()函数时,从套接字回调调用它时,它不会发生任何中断。但当从其他地方调用时,似乎根本没有问题,你的结论是错误的。如果未执行if
子句,也不会获得日志行。这很可能是因为我在您的代码中找不到任何问题。