- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对使用线程还很陌生。我试图设置 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 overload的 Dispatcher.BeginInvoke
它需要一个委托(delegate)类型的参数,该参数采用无参数,并让 C# 编译器在闭包中为您完成肮脏的工作:
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() => SetValue(StateProperty, value));
注意 value
是捕获变量,请注意。
(另外,这个答案不涉及任何线程安全问题,只涉及涉及的委托(delegate)签名。)
关于c# - 多线程环境下 SendOrPostCallback 和 Action 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4315161/
我对使用线程还很陌生。我试图设置 DependencyProperty 的值: public States State { get { return (States)G
我是一名优秀的程序员,十分优秀!