类之间的调度程序

时间:2011-12-11 13:30:58

标签: c# wpf multithreading dispatcher

学习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”中没有任何内容被调用。

1 个答案:

答案 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总是错误的做法