如何将操作传递给任务工厂,并弱引用目标
本文关键字:工厂 目标 引用 任务 操作 | 更新日期: 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();
});
这样,您可以在要进行方法调用时检查WeakReference
的Target
,而不是在分配回调时检查。