编辑:我更新了我的代码。这会实现我的目标吗?
我有一套用于异步调用方法的工作方法,但是我通过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);
答案 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}},而不是在分配回调时。