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