【发布时间】:2014-06-22 06:04:32
【问题描述】:
我有一个场景,其中 Task1 初始化并返回一个 IDisposable 对象以在这样的链式 Task2 中使用:
Task.Factory.StartNew<Stream>(() =>
{
// open and write stream
})
.ContinueWith(prevTask =>
{
var stream = prevTask.Result; // possible AggregateException
// read stream and close it
});
问题是:如何正确处置对象?一个有趣的情况可能是这样的:Task1 打开+读取流,然后发生异常,该异常在 Task2 中重新抛出,因此 Task2 将看不到仍然打开的原始流。
有没有像using () { ... } 这样众所周知的模式来做到这一点?
【问题讨论】:
-
不能用 await 关键字吗?
-
不,它是 .NET4 代码
-
@metalheart:您仍然可以在 .NET 4 中使用 async/await,使用 Microsoft.Bcl.Async 包。不过,您确实需要 C# 5 编译器(VS2012 或更高版本)。
-
"Task1 打开 + 读取流,然后发生异常" - 任务 1 需要注意适当地处理流,直到它完全完成使用它并且不再抛出任何异常.只有在这一点上应该例如设置一个标志,让它知道不再处理它。
-
你真的需要两个独立的
Tasks吗?不能把所有代码都放在StartNew()lambda 里面吗?
标签: .net task-parallel-library