Tag: 线程池

Unity中的PerThreadLifetimeManager

在Unity PerThreadLifetimeManager文档中,我读到:“ 此生命周期管理器不会处置它所拥有的实例 ”。 参考: http : //msdn.microsoft.com/en-us/library/ff647854.aspx 因此,如果我使用的是ThreadPool,是否意味着在返回池中之前,在ThreadPool的Thread上使用Unity解析的对象将不会在该线程的完成工作结束时处理掉? 任何模式或想法如何我可以确保对象确实被处置并从线程池中获得一个干净的线程? 谢谢!

应该何时将任务视为“长时间运行”?

在处理任务时,经验法则似乎是线程池 – 通常由例如调用Task.Run()或Parallel.Invoke() – 应该用于相对较短的操作。 在处理长时间运行的操作时,我们应该使用TaskCreationOptions.LongRunning标志,以便 – 据我所知 – 避免堵塞线程池队列,即将工作推送到新创建的线程。 但究竟什么是长期运行 ? 从时间上看,多长时间? 在决定是否使用LongRunning ,是否还要考虑除预期任务持续时间之外的其他因素,例如预期的CPU架构(频率,核心数……)或将尝试的任务数量从程序员的角度立刻运行? 例如,假设我有500个任务要在专用应用程序中处理,每个任务需要10-20秒才能完成。 我应该只使用Task.Run启动所有500个任务(例如在循环中),然后等待它们全部,可能是LongRunning ,同时保留默认的最大并发级别? 然后,如果我在这种情况下设置LongRunning ,那么与省略LongRunning相比,这不会创建500个新线程并且实际上会导致大量开销和更高的内存使用(由于额外的线程被分配)? 这假设在等待这500个任务时不会安排执行新任务。 我猜想设置LongRunning的决定取决于在给定时间间隔内对线程池发出的请求数,而LongRunning只应该用于预期比大多数线程池花费更长时间的任务 -放置任务 – 根据定义,最多只占所有任务的一小部分。 换句话说,这似乎是一个排队和线程池利用率优化问题,应该通过测试逐个解决,如果有的话。 我对么?

如何强制Task.Factory.StartNew到后台线程?

我已经看到了许多与此相似的其他问题,但在那里找不到我的答案。 我的问题是我用以下流程创建线程: private void btn_Click(object sender, EventArgs e) { service.GetCount( (count, ex) => { if (ex != null) return; for (int i = 0; i < count; i++) { service.Get(onItemReceived, i); } } ); } public void GetCount(Action callback) { var callingThread = TaskScheduler.FromCurrentSynchronizationContext(); Func action = () => { return client.GetCount(); // Synchronous method, […]