所以这是我的代码:
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(...)并在那里停止。
非常感谢任何有关调度员如何工作的见解。
感谢。
答案 0 :(得分:1)
调度程序需要消息泵,控制台应用程序默认情况下没有消息泵。尝试将其作为GUI应用程序运行 - 这将有一个消息泵。
答案 1 :(得分:0)
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);
}
}