Tag: multithreading

替换AppDomain.GetCurrentThreadId(); 使用ManagedThreadId

GetCurrentThreadId()已被弃用,MSDN状态ManagedThreadId替换它。 但是,我得到了不同的结果,后者导致我的代码中出现exception。 我的代码改编自这篇文章 。 public static void SetThreadProcessorAffinity(params byte[] cpus) { if (cpus == null) { throw new ArgumentNullException(“cpus”); } if (cpus.Length == 0) { throw new ArgumentException(@”You must specify at least one CPU.”, “cpus”); } // Supports up to 64 processors long cpuMask = 0; byte max = (byte)Math.Min(Environment.ProcessorCount, 64); foreach (byte cpu in […]

nHibernate在多个线程上枚举相同的集合

我有一个生产应用程序(IIS8,MVC5,nHibernate DAL),我注意到最近的高CPU使用率。 循环应用程序池修复它但在从服务器进行一些诊断和内存转储以分析问题后,我注意到多个线程的一致模式试图枚举相同的集合。 最常见的一点是应用程序检查用户角色的位置。 我怀疑这可能更多的是这个代码是为每个validation权限的请求运行的,所以它更可能是它被卡住的集合? public IList GetRoles(string username) { var login = GetLoginForUser(username); return !login.Groups.Any() ? new List() : login.Groups.SelectMany(x => x.Roles).OrderBy(x => x.DisplayName).ToList(); } 我的CurrentUser对象有一个简单的接口,包含从依赖项解析器注入的用户的详细信息。 我已经validation了UserId存在且有效,这一切都非常简单。 当我看到这两个请求被挂起的转储时,我得到一个警告,多个线程正在枚举一个集合。 当我检查转储中的两个线程时,我看到几乎相同的堆栈跟踪。 (我已经在堆栈跟踪中重命名了一些命名空间细节,但它没有改变)。 两个请求中的userId(和结果配置文件)是相同的,因此它似乎是由于两个单独的线程试图在几乎同时从数据库加载相同的对象。 堆栈跟踪在下面,但我不知道从这里去哪里以解决这个问题。 System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.Nullable`1[[System.Int32, mscorlib]], mscorlib]].FindEntry(System.__Canon)+129 System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.Nullable`1[[System.Int32, mscorlib]], mscorlib]].TryGetValue(System.__Canon, System.Nullable`1 ByRef)+12 NHibernate.AdoNet.ColumnNameCache.GetIndexForColumnName(System.String, NHibernate.AdoNet.ResultSetWrapper)+25 NHibernate.AdoNet.ColumnNameCache.GetIndexForColumnName(System.String, NHibernate.AdoNet.ResultSetWrapper)+25 NHibernate.AdoNet.ResultSetWrapper.GetOrdinal(System.String)+e NHibernate.AdoNet.ResultSetWrapper.GetOrdinal(System.String)+e NHibernate.Type.NullableType.NullSafeGet(System.Data.IDataReader, System.String)+29 NHibernate.Type.NullableType.NullSafeGet(System.Data.IDataReader, System.String[], NHibernate.Engine.ISessionImplementor, System.Object)+16 […]

(显然)正常关闭UDPClient使套接字被阻止

以下代码尽管显然关闭了UDP套接字,但仍然挂起并且无法重新连接到同一地址/端口。 这些是我使用的类变量: Thread t_listener; List XSensAvailablePorts; private volatile bool stopT_listener = false; volatile UdpClient listener; IPEndPoint groupEP; 我用一个处理Socket连接和监听的方法创建并启动一个新线程: private void startSocketButton_Click(object sender, RoutedEventArgs e) { stopT_listener = false; closeSocketButton.IsEnabled = true; startSocketButton.IsEnabled = false; t_listener = new Thread(UDPListener); t_listener.Name = “UDPListenerThread”; t_listener.Start(); } 方法如下(我在Receive上使用超时,以便在套接字上没有发送任何内容并且发出Stop不会Stop它): private void UDPListener() { int numberOfPorts = XSensAvailablePorts.Count(); int currAttempt = […]

替代睡在线程内

各种答案表明睡在线程中是一个坏主意,例如: 避免睡眠 。 为什么呢? 经常给出的一个原因是,如果正在hibernate,很难优雅地退出线程(通过发信号通知它终止)。 假设我想定期检查网络文件夹中的新文件,可能每10秒检查一次。 这对于优先级设置为低(或最低)的线程来说似乎是完美的,因为我不希望可能耗时的文件I / O影响我的主线程。 有哪些替代方案? 代码在Delphi中给出,但同样适用于任何multithreading应用程序: procedure TNetFilesThrd.Execute(); begin try while (not Terminated) do begin // Check for new files // … // Rest a little before spinning around again if (not Terminated) then Sleep(TenSeconds); end; finally // Terminated (or exception) so free all resources… end; end; 一个小修改可能是: // Rest […]

用于multithreadingWindows服务的线程库

我正在寻找一个好的库,最好是在C#中,我可以在Windows服务中使用它,它将处理所需的所有multithreadingfunction。 该服务将每隔x分钟运行一次,检查数据库是否有要调用的进程,并为每个进程生成一个线程并运行它。 每个线程都应该处理exception,日志记录等。 有什么建议?

如何从exe服务运行exe并在exe进程退出时停止服务?

我是一个使用Windows服务的完全初学者。 我有一个基本的骨架为服务工作,我目前正在这样做: protected override void OnStart(string[] args) { base.OnStart(args); Process.Start(@”someProcess.exe”); } 只是为了在程序开始时启动exe。 但是,当进程从exe退出开始时,我想让服务停止。 我很确定我需要做某种线程(我也是初学者),但我不确定这是如何工作的总体轮廓,也不确定从内部阻止进程的具体方法。 你能帮我解决这个问题的一般过程(即从OnStart开始一个线程,那么……?)? 谢谢。

AcceptSocket不尊重Thread.Abort请求

我的理解是Thread.Abort应该在被阻塞的线程上引发ThreadAbortException,但是在处理TcpListener.AcceptSocket时似乎不是这种情况。 以下是该问题的最基本说明: class Program { static void Main(string[] args) { Thread thread = new Thread(Listen); thread.Start(); Thread.Sleep(1000); // give it a second to get going Console.WriteLine(“Aborting listener thread”); thread.Abort(); thread.Join(); Console.WriteLine(“Listener thread finished press to end app.”); Console.ReadLine(); } static void Listen() { try { Console.WriteLine(“Starting to listen”); TcpListener listener = new TcpListener(IPAddress.Any, 4070); listener.Start(); […]

Redis Pub / Sub ServiceStack,取消线程

这可能是一个更通用的线程问题,我不确定。 但我有一个WPF应用程序订阅频道并侦听来自redis数据库的消息。 App.SubscriptionThread = new Thread(() => { _redisSubscription.SubscribeToChannels(“ChannelA”, “ChannelB”); }); App.SubscriptionThread.Start(); 一旦我开始这个,我不知道如何阻止它。 我尝试过的事情。 使用Thread.Abort 。 这显然不会阻止它,因为线程只是永远挂起(没有取消订阅)。 使用UI线程中的_redisSubscription.UnSubscribeFromAllChannels() 。 这也导致应用程序永远进入阻塞状态 使用Environment.Exit(0)强制关闭。 这个似乎可以解决问题。 不幸的是它也有……好……关闭我的应用程序的副作用。 如何停止聆听,我可以随意连接/重新连接? 我是通过在新线程中启动SubscribeToChannels来做错的吗?

如何创建前台任务?

我似乎无法创建前台任务。 我的主线程是支持调用另一个线程然后退出。 另一个线程假设永远运行 void MainThreadMain() { task_main = Task.Factory.StartNew(() => OtherThread()) ; return; } void OtherThread() { while(true) { TellChuckNorrisJoke(); } } 即使主线程已经死了,我怎样才能确保task_main继续运行? 我假设他做了: task_main.IsBackgorund = false; 但没有这样的选择:\我可以让我的主线程等待来自我的其他线程的信号,它传递给Foreground模式。 但那简直太傻了。

完成.net中的任务后停止和删除线程

我在C#中开发了一个窗口应用程序,我正在创建一个线程来执行一个调度事件。 现在这个应用程序将运行一整天,它将为每个事件的每次执行创建一个线程。 如何在分配给该线程的任务完成后从内存中删除线程。 我不想通过使用线程池并为其分配最大线程的特定计数来限制线程创建的数量。