如何通过弱引用目标将操作传递给任务工厂

时间:2012-02-13 15:14:09

标签: c# task-parallel-library weak-references

编辑:我更新了我的代码。这会实现我的目标吗?

我有一套用于异步调用方法的工作方法,但是我通过lambda传入的引用有一个特定的问题。具体来说,我有一个(子)窗口,它启动一个操作并注册一个回调。正如您所料,即使我关闭此窗口,它仍然会被调用。

我想要做的是传递一种“弱引用”或者从传入的动作中构造一个弱引用。

这是我构建Action的方式(示例代码):

static Action CreateNewAction(Action call, Action<SomeArg> callback, 
    Dispatcher dispatcher)
{
    return delegate {
        try
        {
            call();

            var target = callback.Target
            if(target != null)
                dispatcher.Invoke(callback, new SomeArg());
    }
        catch (Exception ex)
        {
            // handle the ex in some way..
        }
    };
}

这就是任务工厂所说的:

var t = Task.Factory.StartNew(CreateNewAction(call, callback, dispatcher))

这就是我所说的(调用只是将操作和回调都引导到任务工厂,如上所示):

WeakReference wr = new WeakReference(myTarget);
StartMyTaskAsync(someAction, ((MyTargetClass)wr.Target).SomeCompletedFunc);

1 个答案:

答案 0 :(得分:0)

问题来自这一行:

StartMyTaskAsync(someAction, ((MyTargetClass)wr.Target).SomeCompletedFunc);

具体来说,这部分:

((MyTargetClass)wr.Target).SomeCompletedFunc

您要实现WeakReference的目标,以便在想要实际检查WeakReference是否放弃{SomeCompletedFunc之前获取lambda / delegate引用的方法。 3}}

你真正想做的是为你的代表传递一个包装器,就像这样(你没有显示StartMyTaskAsync(someAction, () => { // Check the weak reference. If null, return. var target = wr.Target as MyTargetClass; // If null, return. if (target == null) return; // If not null, call. target.SomeCompletedFunc(); }); 的签名,所以我不知道这个电话会是什么样的,我m假设它是一个无参数的无效方法,用于此问题的目的):

Target

这样,您可以在要进行方法调用时检查WeakReference 的{{1}},而不是在分配回调时。