我的应用程序执行了很多后台任务,对于每个这样的操作,我为每个操作创建了一个新线程
Thread StreamResponse = new Thread(() =>
{
DB.ToDb(flag);
});
StreamResponse.Start();
这些操作每分钟发生数千次。注意到该应用程序开始吃RAM。这是正常的,因为应用程序创建了数千个线程而没有关闭它们。
从这里有一个问题,我该怎么做才能让这些动作在一个单独的线程中。例如,我在一个单独的类中创建一个线程,并在此线程中提交动作。
还是可以?完成线程的任务以及完成操作后将自动关闭。但也许更正确的是在另一个线程中执行所有这些步骤。你怎么看?怎么做?
可能正在使用Dispatcher.BeginInvoke
?
答案 0 :(得分:4)
您似乎可以从使用ThreadPool Class中受益。来自MSDN:
提供一个线程池,可用于执行任务,发布工作项,处理异步I / O,代表其他线程等待,以及处理计时器。
以下是使用它的示例代码:
ThreadPool.QueueUserWorkItem((x) =>
{
DB.ToDb(flag);
});
您可以使用ThreadPool.SetMaxThreads Method设置线程池中可用的最大并发线程数,以提高性能并限制应用中的内存使用量。
答案 1 :(得分:0)
为什么不使用任务工厂?
var task = Task.Factory.StartNew(()=>{ /*do stuff*/ });
任务工厂的工作方式与Queue相同,但具有允许您更优雅地处理任何返回信息的优势
var result = await task;
Factory只会在有意义的时候生成线程,因此essentailly与线程池相同
如果您想使用计划更长时间运行的任务,就推荐的做法而言,这也被认为是更好的选择,但是需要指定有关创建任务的信息。
如果您需要更多信息,请在此处提供一个很好的答案:ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew