none
多任务的问题,求解? RRS feed

  • 问题

  • 代码如下:

            public StartUP()
            {
                InitializeComponent();
                _taskDataLoad = new Task(DataLoad);
            }

            //当窗口内容呈现后触发的事件
            private void Window_ContentRendered(object sender, EventArgs e)
            {
                _taskDataLoad.Start();
            }

            private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
                this.DragMove();
            }

            //初始化连接,提示连接异常,加载userzl表
            private void DataLoad()
            {
                MessageBox.Show("任务正在执行!"); ///为什么任务只能执行到这一行////////////////////////
                this.Tips.Foreground = Brushes.Blue;
                this.Tips.Content = "正在连接数据库……";

    为什么任务只能执行到


    此去千万里,岁月忽已晚!

    2013年5月18日 9:37

答案

  • 请将更改UI元素属性的相关代码 用this.Dispatcher.Invoke(delegate { ... }) 返回到UI线程去执行,Task本身已经是开启了另一个工作线程,在多线程情况下,我们的UI元素是线程保护的,只有创建他的线程才有权限修改。

    而且,你用 MessageBox.Show阻塞了工作线程,如果你这里要继续,那么你就必须点击弹出对话框的OK按钮,这个是你想要的吗? 如果不是,那么就不要弹出一个MessageBox来阻塞操作。

    所以你的代码应该是:

    private void DataLoad()
    {
    	// MessageBox.Show("任务正在执行!"); ///为什么任务只能执行到这一行////////////////////////
    	this.Dispatcher.Invoke(delegate
    	{
    		this.Tips.Foreground = Brushes.Blue;
    		this.Tips.Content = "正在连接数据库……";
    	});


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2013年5月27日 9:05
    版主

全部回复

  • hi,

    有报错吗?或者异常神马的?


    Cheers, Amy

    2013年5月21日 12:54
  • 请将更改UI元素属性的相关代码 用this.Dispatcher.Invoke(delegate { ... }) 返回到UI线程去执行,Task本身已经是开启了另一个工作线程,在多线程情况下,我们的UI元素是线程保护的,只有创建他的线程才有权限修改。

    而且,你用 MessageBox.Show阻塞了工作线程,如果你这里要继续,那么你就必须点击弹出对话框的OK按钮,这个是你想要的吗? 如果不是,那么就不要弹出一个MessageBox来阻塞操作。

    所以你的代码应该是:

    private void DataLoad()
    {
    	// MessageBox.Show("任务正在执行!"); ///为什么任务只能执行到这一行////////////////////////
    	this.Dispatcher.Invoke(delegate
    	{
    		this.Tips.Foreground = Brushes.Blue;
    		this.Tips.Content = "正在连接数据库……";
    	});


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2013年5月27日 9:05
    版主