Dispatcher.BeginInvoke c#,silverlight
在Silverlight中,为了处理对UI线程的调用,我们应该使用Dispatcher.BeginInvoke c#,silverlight,c#,silverlight,marshalling,C#,Silverlight,Marshalling,在Silverlight中,为了处理对UI线程的调用,我们应该使用this.Dispatcher.BeginInvoke((ThreadStart)delegate(){}) 我的问题是,如果多个线程调用一个函数,那么这些调用会排队并一个接一个地执行吗?如果是,那么我可以安全地假设,即使函数是从多个线程调用的,this.Dispatcher.BeginInvoke((ThreadStart)delegate(){})中的代码是线程安全的吗?当代码没有状态时,它是线程安全的,不会修改可以跨线程边界
this.Dispatcher.BeginInvoke((ThreadStart)delegate(){})
我的问题是,如果多个线程调用一个函数,那么这些调用会排队并一个接一个地执行吗?如果是,那么我可以安全地假设,即使函数是从多个线程调用的,
this.Dispatcher.BeginInvoke((ThreadStart)delegate(){})中的代码代码>是线程安全的吗?当代码没有状态时,它是线程安全的,不会修改可以跨线程边界共享的状态,也不会以受控方式修改状态,该状态的所有用户都共享该状态以确保线程安全(例如锁)
因此,无法保证来自的线程安全性。这就是说,可以保证委托将全部在同一个线程(UI线程)上执行,因此您可以假设委托不会并发运行。这并不意味着它们本质上是线程安全的-这取决于您在这些委托中所做的操作-但如果您不旋转这些委托中的其他线程或与这些委托调用的方法进行交互,则可以假定线程安全。代码在没有状态时是线程安全的,不修改可以跨线程边界共享的状态,也不以受控方式修改该状态的所有用户共享的状态,以确保线程安全(例如锁)
因此,无法保证来自的线程安全性。这就是说,可以保证委托将全部在同一个线程(UI线程)上执行,因此您可以假设委托不会并发运行。这并不意味着它们本质上是线程安全的——这取决于您在这些委托中所做的工作——但如果您不旋转这些委托中的其他线程或与这些委托调用的方法进行交互,则可以假定它们是线程安全的。是的,这些调用会排队。对BeginInvoke
的调用是线程安全的(您可以随时从任何线程调用此方法),所有封送到UI线程的调用都运行单线程。因为只有一个UI线程。因为。是的,这些电话排队。对BeginInvoke
的调用是线程安全的(您可以随时从任何线程调用此方法),所有封送到UI线程的调用都运行单线程。因为只有一个UI线程。因为。一般来说,是的,您可以将每个委托添加到队列中以等待调度程序线程的处理
我不确定在调用Dispatcher.BeginInvoke()调用的委托时是否有任何当前或将来的排序保证,但我知道,目前似乎保留了排序
尽管如此,不管怎样-是的,可以安全地假设只有Dispatcher(UI)线程-因此不会同时调用多个委托。一般来说,是的,每个委托都被添加到队列中以等待Dispatcher线程处理是正确的
我不确定在调用Dispatcher.BeginInvoke()调用的委托时是否有任何当前或将来的排序保证,但我知道,目前似乎保留了排序
尽管如此——是的,可以安全地假设只有Dispatcher(UI)线程——因此不会同时调用多个委托。由于使用(ThreadStart)委托类型,您的代码片段有点误导。重要的是要知道,在任何STA线程环境中,只有一个线程是“UI”线程。所有UI对象都需要在该线程上创建并与之交互
因此,Dispatcher可用于多种用途,最容易理解的用法是从后台线程使用它,将要调用的内容放回UI线程。因此,您在其中输入的内容并不完全是“线程安全”的,但它保证在UI线程上被调用。如果你把你所做的一切都放到UI线程上,它将被一个接一个地调用,而不是同时调用
BeginInvoke是一个异步调用,用于将委托放入UI线程队列,而Invoke是一个同步调用。真正令人难以置信的是,您实际上可以从UI线程调用Invoke,它将阻塞、将您的委托放入队列并让位于队列中的下一项,最终调用它刚刚调用的内容
要记住的另一件重要事情是,调度器实际上是一个按优先级排序的队列。因此,从先进先出的意义上讲,它不是一个纯粹的队列,因为您插入队列的位置取决于您的优先级,并且完全有可能有足够多的东西被塞进队列中,以至于您调用的方法永远无法执行。由于使用了(ThreadStart),您的代码片段有点误导委托类型。重要的是要知道,在任何STA线程环境中,只有一个线程是“UI”线程。所有UI对象都需要在该线程上创建并与之交互
因此,Dispatcher可用于多种用途,最容易理解的用法是从后台线程使用它,将要调用的内容放回UI线程。因此,您在其中输入的内容并不完全是“线程安全”的,但它保证在UI线程上被调用。如果你把你所做的一切都放到UI线程上,它将被一个接一个地调用,而不是同时调用
BeginInvoke是一个异步调用,用于将委托放入UI线程队列,而Invoke是一个同步调用。真正令人难以置信的是,您实际上可以从UI线程调用Invoke,它将阻塞、将您的委托放入队列并让位于队列中的下一项,最终调用它刚刚调用的内容
另一件需要记住的重要事情是,调度员实际上是一个优先权人