gpt4 book ai didi

c# - 多线程环境下 SendOrPostCallback 和 Action 的区别?

转载 作者:行者123 更新时间:2023-11-30 20:11:02 27 4
gpt4 key购买 nike

我对使用线程还很陌生。我试图设置 DependencyProperty 的值:

    public States State
{
get { return (States)GetValue(StateProperty); }
set
{
Dispatcher.BeginInvoke(DispatcherPriority.Background,
//(SendOrPostCallback)delegate { SetValue(StateProperty, value); }, //works
(Action)(()=> SetValue(StateProperty, value)), //doesnt
value);
}
}
public static readonly DependencyProperty StateProperty =
DependencyProperty.Register("State", typeof(States), typeof(FTPDownload), new UIPropertyMetadata(States.Idle));

我意识到在 setter 中你必须使用 SendOrPostCallback 的艰难方式(因为它在调用方法时提供了一个参数)。它不适用于 Action(因为缺少参数。而且,wpf 真的是个婊子,调试并找到 TargetParameterCountException 的原因,“没有可用的源”并且根本没有任何线索。

为什么我必须在那里使用 SendOrPostCallback?我怎么知道在这种情况下这是正确的?因为实际上调用 setter 是通过以下方式工作的:

Dispatcher.BeginInvoke((Action)(()=>State=States.Updating), null);

并使用 SendOrPostCallback 而不是当然会导致 TargetParameterCountException..

只是想知道这样看似不一致的事情是否只是常识?在这里感觉有点迷茫,至少自从谷歌搜索 SendOrPostCallback、Action 和 BeginInvoke 以来,因为关键字没有有意义的结果。

最佳答案

相关信息:

1. Dispatcher.BeginInvoke 的过载您正在使用的是:

public DispatcherOperation BeginInvoke(
DispatcherPriority priority,
Delegate method,
Object arg
)

method : 方法的委托(delegate)接受一个参数,该参数被推送到 Dispatcher 事件队列。

2. SendOrPostCallBack 委托(delegate)声明为:

public delegate void SendOrPostCallback(object state)

3.至于 Action :

public delegate void Action()

很明显,SendOrPostCallBack delegate 是兼容的,因为它接受一个参数但是 Action不是,因为它是无参数的。

当然,你可以使用 Action<T> 委托(delegate),如果您愿意,它确实接受一个参数:

Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action<States>(arg => SetValue(StateProperty, arg)),
value);

或者,您可以使用 different overloadDispatcher.BeginInvoke它需要一个委托(delegate)类型的参数,该参数采用参数,并让 C# 编译器在闭包中为您完成肮脏的工作:

Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() => SetValue(StateProperty, value));

注意 value是捕获变量,请注意。

(另外,这个答案不涉及任何线程安全问题,只涉及涉及的委托(delegate)签名。)

关于c# - 多线程环境下 SendOrPostCallback 和 Action 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4315161/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com