我正在尝试创建一个包装两个IDispoable对象的复合对象。这些对象控制我的PC和两个硬件之间的连接。通常这些将在使用块内使用。但是,我希望将它们保留在复合对象中。复合对象也是IDispoable,它通过在处理它们时调用它们的dispose方法来处理它所包装的两个对象的清理。
我在使用C#控制台应用程序开发代码时测试代码。如果我使用具有以下形式的方法同步创建两个对象,则按预期工作:
public CompositeObject BulidSync()
{
IDisposeableA objectA = factory.CreateA();
ObjectA.DoSomthing();
IDisposeableB objectB = factory.CreateB();;
return new CompositeObject(objectA, objectB);
}
由于创建两个对象需要一些时间,因此我想异步创建两个包装对象。然后程序按预期运行直到完成。程序执行最后一次操作后会有相当大的延迟(最多约10秒)。异步代码如下所示:
public CompositeObject BulidAsync()
{
Task<CompositeObject> tsk = createAsync();
return tsk.Result;
}
private async Task<CompositeObject> createAsync()
{
Task<IDisposeableA> task_A = Task.Run(() =>
{
IDisposeableA objectA = factory.CreateA();
objectA.DoSomthing();
return IDisposeableA;
});
Task<IDisposeableB> task_b = Task.Run(() =>
{
return factory.CreateB();
});
Task[] tasks = new Task[2] { task_A, task_b};
await Task.WhenAll(tasks);
IDisposeableA objectA = task_A.Result;
IDisposeableB objectB = task_b.Result;
return new CompositeObject(objectA, objectB);
}
我已经逐步完成了代码,并看到了被调用包装对象的dispose方法。
我这样做了吗?如果我异步创建对象,在处理对象时是否需要做一些额外的事情?