Tag: threadpool

SynchronizationContext.Send和SynchronizationContext.Post有什么区别?

感谢Jeremy Miller在日常.NET开发的function编程方面所做的出色工作,我有一个工作的命令执行器,可以完成我想要的所有工作(对线程池进行繁重的工作,将结果或错误发送回同步环境,甚至发布回到同步上下文),但我无法解释为什么它使用来自线程池的SynchronizationContext.Send和来自Func Synchronization.Post传递给执行繁重工作的方法。 我已经多次阅读过这些文档,但是我无法直截了当地了解它的区别。 我应该从一个名为Send的事实中得到什么,一个叫做Post ? 我感觉神奇的是Send “启动同步请求”和Post “启动异步请求”,但这两个请求都来自线程池,需要发送/发回到UI线程。 有人可以解释这个区别,即使它只是一个助记符设备让我知道何时选择一个而不是另一个? 如果重要,这是我的测试代码 ,我使用Post将进度发送回UI: private Action _ExecuteCommand (SynchronizationContext context , Action progress , Action after) { int count = 3; int accumulatedValue = 0; int threadId = Thread.CurrentThread.ManagedThreadId; for (int i = 0; i after(threadId, accumulatedValue); } _ExecuteCommand方法作为下面的command参数传入,主要来自原始文章,它使用Send将完成和错误消息发送回UI: public void Execute(Func command, Action error) { ThreadPool.QueueUserWorkItem(o => […]

C# – 何时在高活动性服务器中使用标准线程,ThreadPool和TPL

我最近一直在阅读很多关于线程的内容,因为我正在寻求开发一个能够处理多达10,000-20,000个客户端的高性能,可扩展的TCP服务器,每个客户端都通过基于命令的方式与服务器进行双向通信。系统。 服务器将接收命令,并根据命令执行单个(或多个)任务。 我的问题是如何在各种情况下适当地使用.NET线程构造,执行可能需要一分钟到几个小时的任务,具体取决于正在执行的工作。 最令我困惑的是,无论我在哪里阅读,我都会看到“使用手动创建的线程(或自定义线程池)来处理’长期运行’任务,并使用TPL执行短期任务或任务需要并行处理。“ 究竟什么是长期任务? 那是5秒,60秒,一小时吗? 我应该在什么时间框架中使用这三种创建线程的方法: 手动创建的线程 .NET ThreadPool类 TPL 我想到的另一个问题如下 – 说我的服务器实际上连接了20,000个客户端,每个客户端每秒发送1个命令(可以转换为一个或多个任务)。 即使使用强大的硬件,我也不可能将过高的工作量推入到我拥有的任何线程池/工作项队列中,从而最终在队列缓慢填充到最大值后生成OutOfMemoryException? 任何见解将不胜感激。

更改线程池线程的文化是否会在返回池时影响它?

如果我设置线程池线程的CurrentCulture ,当线程完成执行并返回到线程池时会发生什么? 它是否将其CurrentCulture重置为默认值(无论可能意味着什么),还是会保留我在其上设置的文化? 我希望框架将线程重置为默认状态以防止这种情况,但是找不到任何这种效果的文档。 我找到的最接近的是来自ThreadPool的MSDN文档: 当线程池重用线程时,它不会清除线程本地存储中或使用ThreadStaticAttribute属性标记的字段中的数据。 因此,通过一个方法放置在线程本地存储中的数据可以暴露给由同一线程池线程执行的任何其他方法。 这似乎表明线程在返回时没有重置。 我已经尝试了一些示例代码来尝试对此进行测试,看起来确实重置了文化,但我不相信我正在测试这种行为,因为我认为我只使用了ThreadPool的一小部分线程,并且所以不能确定我正在测试一个已经拥有它的文化集的线程。

在函数完成其任务后定期执行函数

我正在使用C#和xaml构建一个Windowsapp store应用。 我需要在一定的时间间隔后刷新数据(从服务器获取新数据)。 我使用ThreadPoolTimer定期执行刷新function,如下所示: TimeSpan period = TimeSpan.FromMinutes(15); ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer(async(source)=> { n++; Debug.WriteLine(“hello” + n); await dp.RefreshAsync(); //Function to refresh the data await Dispatcher.RunAsync(CoreDispatcherPriority.High, () => { bv.Text = “timer thread” + n; }); }, period); 这工作正常。 唯一的问题是如果在将下一个实例提交给线程池之前刷新函数没有完成该怎么办。 有没有办法指定执行之间的差距。 第1步:执行刷新function(花费任何时间) 第2步:刷新function完成其执行 步骤3:间隙15分钟然后转到步骤1 刷新function执行。 执行结束后15分钟,它再次执行。

任务继续与async / await并行执行

在使用async / await结构的控制台应用程序的上下文中,我想知道“continuation”是否可以在不同CPU上的多个线程上并行运行。 我认为就是这种情况,因为延迟发布在默认任务调度程序(控制台应用程序中没有SynchronizationContext)上,这是线程池。 我知道async / await构造不构造任何额外的线程。 仍然应该由线程池为每个CPU构建至少一个线程,因此如果在线程池上发布了continuation,它可以在不同的CPU上并行调度任务延续…这就是我的想法,但出于某种原因我昨天对此我真的很困惑,我不再那么肯定了。 这是一些简单的代码: public class AsyncTest { int i; public async Task DoOpAsync() { await SomeOperationAsync(); // Does the following code continuation can run // in parrallel ? i++; // some other continuation code …. } public void Start() { for (int i=0; i<1000; i++) { var _ = […]

等到所有线程在ThreadPool中完成工作

我有这个代码: var list = new List(); for(int i=0;i<10;i++) list.Add(i); for(int i=0;i { Console.WriteLine(x); }), list[i]); } 我想知道所有线程池线程什么时候完成他们的工作。 我怎么能这样做?

始终在Windows服务上运行线程

我正在编写一个Windows服务,它将启动多个工作线程,这些线程将监听Amazon SQS队列并处理消息。 将有大约20个线程监听10个队列。 线程必须始终运行,这就是为什么我倾向于实际使用实际线程作为工作循环而不是线程池线程。 这是一个顶级实现。 Windows服务将启动多个工作线程,每个线程都会监听它的队列和进程消息。 protected override void OnStart(string[] args) { for (int i = 0; i < _workers; i++) { new Thread(RunWorker).Start(); } } 这是工作的实施 public async void RunWorker() { while(true) { // .. get message from amazon sqs sync.. about 20ms var message = sqsClient.ReceiveMessage(); try { await PerformWebRequestAsync(message); await InsertIntoDbAsync(message); } […]

ThreadPool SetMaxThreads和SetMinThreads Magic Number

是否有一个神奇的数字或公式来设置ThreadPool的SetMaxThreads和SetMinThreads的值? 我有成千上万个需要执行的长时间运行方法,但却无法找到设置这些值的完美匹配。 任何建议将不胜感激。

C#Downloader:我应该使用Threads,BackgroundWorker还是ThreadPool?

我正在用C#编写一个下载程序并停止了以下问题:我应该使用什么样的方法来并行化我的下载并更新我的GUI? 在我的第一次尝试中,我使用了4个线程,并且在每个线程完成时我开始了另一个:主要问题是我的cpu在每个新线程启动时都是100%。 谷歌搜索,我发现BackgroundWorker和ThreadPool的存在:说我想用我正在下载的每个链接的进度更新我的GUI,什么是最好的解决方案? 1)创建4个不同的BackgroundWorker,附加到每个ProgressChanged事件,委托GUI中的函数来更新进度? 2)使用ThreadPool并将最大和最小线程数设置为相同的值? 如果我选择#2,当队列中没有更multithreading时,是否会停止4个工作线程? 它暂停了吗? 由于我必须下载不同的链接列表(每个链接20个链接)并在完成一个链接时从一个链接移动到另一个链接,ThreadPool是否在每个列表之间启动和停止线程? 如果我想在live上更改工作线程的数量并决定使用ThreadPool,从10个线程更改为6,它是否会抛出exception并停止4个随机线程? 这是让我头疼的唯一部分。 我提前感谢你们每个人的答案。

线程/线程池或后台工作者

我想知道什么用于需要很多性能的任务。 Backgroundworker , Thread还是ThreadPool ? 到目前为止,我一直在使用Threads,但我需要提高应用程序的速度。