我想触发一个在后台线程上运行的任务.我不想等待任务完成.
在.net 3.5中,我会这样做:
ThreadPool.QueueUserWorkItem(d => { DoSomething(); });
Run Code Online (Sandbox Code Playgroud)
在.net 4中,TPL是建议的方式.我见过的常见模式是:
Task.Factory.StartNew(() => { DoSomething(); });
Run Code Online (Sandbox Code Playgroud)
但是,该StartNew()方法返回一个Task实现的对象IDisposable.推荐这种模式的人似乎忽视了这一点.有关该Task.Dispose()方法的MSDN文档说:
"在释放对任务的最后一个引用之前,始终调用Dispose."
你不能在任务完成之前调用dispose,所以让主线程等待并调用dispose会首先打破后台线程上的操作.似乎也没有任何已完成/已完成的事件可用于清理.
Task类上的MSDN页面没有对此进行评论,并且"Pro C#2010 ..."一书推荐了相同的模式,并且没有对任务处理做出评论.
我知道如果我离开它,终结者最终会抓住它,但当我做了大量的火灾并且忘记了这样的任务并且终结者线程被淹没时,它会回来咬我吗?
所以我的问题是:
Dispose()就Task在这种情况下类?如果是这样,为什么会有风险/后果?Task我错过的物体?如果我想对某些代码进行"一劳永逸",但仍希望确保清理我的内存(为什么异步委托方法需要调用EndInvoke?),以下是否会实现这一目标?
Action myAction = () => LongRunTime();
myAction.BeginInvoke(myAction.EndInvoke,null);
Run Code Online (Sandbox Code Playgroud)
我环顾四周,但没有看到任何地方使用过的模式.相反,人们使用annonomoyus方法作为他们的回调(例如结束BeginInvoke的正确方法?)或者他们定义一个实际的回调方法.由于我没有看到其他人这样做,这让我觉得它要么不起作用,要么是一个坏主意.
谢谢!