DispatcherObject的继承和使用…我没有得到什么
本文关键字:什么 继承 DispatcherObject | 更新日期: 2023-09-27 18:03:45
下面是我的代码:
class Program
{
static DispatchClass dc;
[STAThread]
static void Main(string[] args)
{
dc = new DispatchClass();
Thread th = new Thread(AccessDC);
th.Start();
Console.ReadKey();
}
private delegate void AccessDCDelegate(object state);
static private void AccessDC(object state)
{
if(dc.Dispatcher.CheckAccess())
dc.Print("hello");
else
dc.Dispatcher.Invoke(new AccessDCDelegate(AccessDC));
}
}
public class DispatchClass : DispatcherObject
{
public void Print(string str)
{
Console.WriteLine(str);
}
}
现在…我期望的输出是创建的线程检查分派器访问,看看它在不同的线程上,然后在原始线程上调用AccessDC(…),然后检查并看到它在正确的线程上并调用dc.Print(…)。
实际发生的是它到达CheckAccess()并正确地看到它不在正确的线程上,然后调用Invoke(…)并在那里停止。
如果您对Dispatchers的工作原理有任何了解,将不胜感激。
谢谢。
调度程序需要消息泵,控制台应用程序默认没有消息泵。试着把它作为一个GUI应用程序来运行——它将有一个消息泵。
CheckAccess验证你的CurrentThread DispatchClass是当前线程,所以它返回给你False。这很正常。在这段代码中
dc.Dispatcher.Invoke(new AccessDCDelegate(AccessDC));
你对争论有问题,仅此而已。
这段代码可以工作:
public partial class MainWindow : Window
{
static DispatchClass dc;
public MainWindow()
{
InitializeComponent();
dc = new DispatchClass();
Thread th = new Thread(AccessDC);
th.Start();
}
private delegate void AccessDCDelegate(object state);
static private void AccessDC(object state)
{
if (dc.Dispatcher.CheckAccess())
dc.Print("hello");
else
dc.Dispatcher.BeginInvoke(new Action(()=> AccessDC(null)));
}
}
public class DispatchClass : DispatcherObject
{
public void Print(string str)
{
MessageBox.Show(str);
}
}