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

C# 如何通过对目标的弱引用将操作传递给任务工厂,c#,task-parallel-library,weak-references,C#,Task Parallel Library,Weak References,编辑:我更新了我的代码。这能实现我的目标吗 我有一个异步调用方法的工作方法集,但是我通过lambda传入的引用有一个特定的问题。具体来说,我有一个(子)窗口,用于启动操作并注册回调。正如您所料,即使我关闭此窗口,它仍会被调用 我想做的是传入一种“弱引用”,或者从传入的操作中构造一个弱引用 这是我构建动作的方式(示例代码): 这就是我对它的调用方式(调用只是将动作和回调传递到任务工厂,如上图所示): 问题来自这一行: StartMyTaskAsync(someAction, ((MyTargetC

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

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

我想做的是传入一种“弱引用”,或者从传入的操作中构造一个弱引用

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

这就是我对它的调用方式(调用只是将动作和回调传递到任务工厂,如上图所示):


问题来自这一行:

StartMyTaskAsync(someAction, ((MyTargetClass)wr.Target).SomeCompletedFunc);
具体而言,本部分:

((MyTargetClass)wr.Target).SomeCompletedFunc
在您想要实际检查
WeakReference
是否已放弃之前,您正在具体化的目标,以获取lambda/委托引用的方法

您真正想要做的是为您的委托传递一个包装器,类似这样(您没有显示
SomeCompletedFunc
的签名,因此我不知道调用会是什么样子,我假设这是一个无参数void方法,用于此问题):


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

问题来自这一行:

StartMyTaskAsync(someAction, ((MyTargetClass)wr.Target).SomeCompletedFunc);
具体而言,本部分:

((MyTargetClass)wr.Target).SomeCompletedFunc
在您想要实际检查
WeakReference
是否已放弃之前,您正在具体化的目标,以获取lambda/委托引用的方法

您真正想要做的是为您的委托传递一个包装器,类似这样(您没有显示
SomeCompletedFunc
的签名,因此我不知道调用会是什么样子,我假设这是一个无参数void方法,用于此问题):


这样,你就可以在你想调用方法的时候,而不是在分配回调的时候,检查
WeakReference的
目标

当你在一个关闭的窗口上调用这个动作时,会发生什么呢?@svick-hm我只是在构建它,现在没有太多发生,但它会返回数据,我猜这可能是在datacontext上设置的。那么,为什么发生这种情况会有问题呢?@svick那么,为了简化这一点,你是否建议忽略这个具体案例?我很担心,因为子窗口将以这种方式处理。
window
不可
IDisposable
,因此无法处理它。如果你的意思是它不会马上被垃圾收集,那是真的。但在我看来,这并不是问题,因为回调最终会执行,之后可能会收集窗口。当你在关闭的窗口上调用该操作时,会发生什么情况?@svick-hm我只是在构建它,所以现在不会发生太多,但它会返回数据,我猜这可能是在datacontext上设置的。那么,为什么发生这种情况会有问题呢?@svick那么,为了简化这一点,你是否建议忽略这个具体案例?我很担心,因为子窗口将以这种方式处理。
window
不可
IDisposable
,因此无法处理它。如果你的意思是它不会马上被垃圾收集,那是真的。但在我看来,这不是问题,因为回调最终会执行,之后可能会收集窗口。
((MyTargetClass)wr.Target).SomeCompletedFunc
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();
});