学习C#,WPF。目前正试图掌握Dispatchers,特别是在线程和其他类之间。
我让我的调度员在'MainWindow'类中工作,但当我将其分离到另一个类时,我得到编译错误消息“类型'System.Windows.Threading.Dispatcher'没有定义构造函数“
显然是一个基本的学习错误,但我无法弄清楚。下面的代码,请按正确的方向推进:)
namespace threading_dispatcher_learn
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public delegate void MyDel();
public MainWindow()
{
InitializeComponent();
label1.Content = "Label1";
this.label2.Content = this.Dispatcher.Thread.ManagedThreadId;
Myupdator updateclass = new Myupdator();
Thread MyNewThread;
MyNewThread = new Thread(updateclass.UpdateLabel);
MyNewThread.Start();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Clicked");
}
}
public class Myupdator
{
public void UpdateLabel()
{
MainWindow.MyDel del1 = delegate()
{
try
{
// label1.Content = "Update 2";
//Thread.Sleep(3000);
MessageBox.Show("Message 2");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
};
/* Now removed
Dispatcher myDispather = new Dispatcher();
myDispather.BeginInvoke(DispatcherPriority.Normal, del1);
*/
//now added
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, del1);
Dispatcher.CurrentDispatcher.InvokeShutdown();
}
}
}
UPDATE :上面修改过的代码,这是正确的方法吗?我理解你了吗?虽然“del1”中没有任何内容被调用。
答案 0 :(得分:3)
您不应该使用构造函数创建Dispatcher
instane。要访问当前线程的Dispatcher
(如果尚不存在,则创建一个新线程),只需获取Dispatcher.CurrentDispatcher
的值即可。不要忘记在不再需要时关闭调度员(例如Dispatcher.InvokeShutdown
)。
但是,你为什么要这样做?在绝大多数情况下,创建Dispatcher
是不对的。 Dispatcher
为Windows消息循环建模,因此它仅对UI线程有意义。
更新:您似乎只是想修改标签的内容并显示一个对话框。 您不得为此创建新的Dispatcher
;相反,使用已在UI线程上创建的Dispatcher
。您需要将从主线程获取的Dispatcher.CurrentDispatcher
的值传递给新线程,或者您需要传递对任何UI控件的引用(例如标签或窗口)本身)。
例如:
var mainWindow = ... ; // you need to pass this to your new thread somehow
mainWindow.Dispatcher.BeginInvoke(DispatcherPriority.Normal, del1);
让我再次重复经验法则:除非你在多线程应用程序方面有丰富的经验,否则创建一个新的Dispatcher
总是错误的做法。