异步创建IDisposable对象会导致程序在关闭时滞后

时间:2015-12-10 12:07:32

标签: c# asynchronous idisposable

我正在尝试创建一个包装两个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方法。

我这样做了吗?如果我异步创建对象,在处理对象时是否需要做一些额外的事情?

0 个答案:

没有答案