C# 类间调度器

C# 类间调度器,c#,wpf,multithreading,dispatcher,C#,Wpf,Multithreading,Dispatcher,学习C#,WPF。目前正在尝试处理分派器,特别是线程和其他类之间的分派器 我让我的调度程序在“MainWindow”类中工作,但当我将其按如下方式分离到另一个类中时,我得到编译错误消息“type”System.Windows.Threading.dispatcher“未定义构造函数” 很明显,这是一个基本的学习错误,但我想不出来。代码如下,请按正确方向推:) 命名空间线程\u调度程序\u学习 { /// ///MainWindow.xaml的交互逻辑 /// 公共部分类主窗口:窗口 { 公共

学习C#,WPF。目前正在尝试处理分派器,特别是线程和其他类之间的分派器

我让我的调度程序在“MainWindow”类中工作,但当我将其按如下方式分离到另一个类中时,我得到编译错误消息“type”System.Windows.Threading.dispatcher“未定义构造函数”

很明显,这是一个基本的学习错误,但我想不出来。代码如下,请按正确方向推:)

命名空间线程\u调度程序\u学习
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
公共委托void MyDel();
公共主窗口()
{
初始化组件();
label1.Content=“label1”;
this.label2.Content=this.Dispatcher.Thread.ManagedThreadId;
MyUpdater updateclass=新的MyUpdater();
线程MyNewThread;
MyNewThread=新线程(updateclass.UpdateLabel);
MyNewThread.Start();
}
私有无效按钮1\u单击(对象发送者,路由目标)
{
MessageBox.Show(“单击”);
}
}
公共类MyUpdater
{
公共void UpdateLabel()
{
MainWindow.MyDel del1=委托()
{
尝试
{
//标签1.Content=“更新2”;
//睡眠(3000);
MessageBox.Show(“消息2”);
}
捕获(例外情况除外)
{
Show(例如ToString());
}
};
/*现在移除
Dispatcher myDispatcher=new Dispatcher();
myDispather.BeginInvoke(DispatcherPriority.Normal,del1);
*/
//现在加上
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal,del1);
Dispatcher.CurrentDispatcher.InvokeShutdown();
}
}
}

更新:上面修改的代码,这是正确的方法吗?我对你的理解正确吗?尽管“del1”中没有任何内容被调用

不应使用构造函数创建
调度程序
实例。要访问当前线程的
Dispatcher
(或者创建一个新线程,如果还没有),只需获取的值。当不再需要调度器时,不要忘记关闭它(例如使用)

然而,你为什么要这样做?在绝大多数情况下,创建
调度程序
是错误的<代码>调度程序
为Windows消息循环建模,因此它仅在UI线程上有意义

更新:您似乎只是试图修改标签的内容并显示一个对话框您不能为此创建新的
调度程序
;相反,请使用已经在UI线程上创建的
Dispatcher
。您需要将取自主线程的
Dispatcher.CurrentDispatcher
值传递给新线程,或者您需要传递对任何UI控件(例如标签或窗口本身)的引用

例如:

var mainWindow = ... ; // you need to pass this to your new thread somehow
mainWindow.Dispatcher.BeginInvoke(DispatcherPriority.Normal, del1);

让我再次重复一下经验法则:除非您在多线程应用程序方面有丰富的经验,否则创建新的
调度程序总是错误的。

现在使用“Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal,del1);Dispatcher.CurrentDispatcher.InvokeShutdown();”已删除错误,但线程内的操作未发生。我确实想在GUI上执行一个操作,它现在刚刚被注释掉,并替换为一个messagebox。@Damo:不,只是忘了创建一个新的调度程序!在
main窗口的构造函数中
,保留对
的引用,并将其传递给新线程;这是我更新的示例中的
main窗口。
var mainWindow = ... ; // you need to pass this to your new thread somehow
mainWindow.Dispatcher.BeginInvoke(DispatcherPriority.Normal, del1);