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

本文关键字:工厂 目标 引用 任务 操作 | 更新日期: 2023-09-27 18:24:13

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

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

我想做的是传入一种"弱引用"或从传入的操作中构造一个弱引用。

这是我构建操作的方式(示例代码(:

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);

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

问题来自这一行:

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

具体来说,这部分:

((MyTargetClass)wr.Target).SomeCompletedFunc

您正在具体化WeakReference的目标以获取lambda/委托引用的方法,早在您要实际检查WeakReference是否放弃了Target之前。

真正想做的是为你的代表传递一个包装器,像这样(你没有显示SomeCompletedFunc的签名,所以我不知道调用会是什么样子,我假设它是一个无参数的 void 方法,用于这个问题的目的(:

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();
});

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