下面是我的代码(一个按钮事件,WPF的):
private void partition_button_Click(object sender, RoutedEventArgs e)
        {
            if (value_judgement(partition_textBox1.Text))
            {
                if (partition_textBox2.Text != null && !partition_textBox2.Text.Equals(""))
                {
                    textBlock.Text = "正在生成补丁,请稍候...";
                    String dirName = partition_textBox2.Text;
                    int datasize = int.Parse(partition_textBox1.Text);
                    Boolean isComplete = new OperationCenter().partition_operation(datasize, dirName);
                    if (isComplete)
                    {
                        textBlock.Text = "";
                        MessageBox.Show("分区补丁生成成功!并且已经自动签名,如需要,请自行重命名文件", "提示", MessageBoxButton.OK);
                    }
                    else
                    {
                        textBlock.Text = "";
                        MessageBox.Show("分区补丁生成失败!请检查后重试", "提示", MessageBoxButton.OK);
                    }
                }
            }代码的作用是:当主窗口上partition_textBox2和partition_textBox2这两个文本框都不为空时,将主窗口上的textBlock文本框中的文本设置为"正在生成补丁,请稍候..."后,调用另一个类中的partition_operation方法进行补丁生成操作。无论成功与否,都擦除textBlock中的文本内容并弹框提示。现在的问题是,点击按钮以后,textBlock中并未出现文本内容,其他一切正常,在生成补丁的过程中,主窗口就僵住了。而当我删除textBlock.Text = "";代码后,则出现补丁生成完成之后textBlock中才出现"正在生成补丁,请稍候..."的文本,正常情况下不是应该先执行产生文本的语句吗?而且,我以前在编Java程序的时候也是这样,一旦点击按钮处理一个任务的时候,主窗口就僵住了,不接受任何操作与反馈。这个问题都不知道该怎么百度搜索才好了,一直没解决。大家有谁知道是怎么回事吗?难道要为任务操作都使用新线程才行吗?

解决方案 »

  1.   

    因为你使用的是主线程在执行操作,导致主线程上对UI的更新无法即时进行。
    解决办法:
    将主线程上的比较耗时的操作,另开线程(异步)进行,避免UI假死。
      

  2.   

    嗯,我今天试了下,用多线程可以解决,但是又出现了一个问题:多线程是否执行完操作,主线程无法得知,也就是无法在操作执行完之后随即更新textBlock的值,这个该怎么解决呢,附加线程只能使用静态方法向主线程反馈信息,但是textBlock是主线程UI控件,静态方法里不能对它进行操作。
      

  3.   

    解决方法:
    一,通过委托,textBlock是主线程创建的资源,其他线程想修改直接textBlock的属性是不允许(非安全),其他线程只能通过委托的方法进行。
    二,获取textBlock所在窗口句柄,其他线程通过SendMessage Win32API函数向窗口发送消息,由主线程自己来更新。上面两种方法都可以,标准做法是[方法一],但是以前我用[方法一]做的时候,譬如修改textBlock的Text内容时,不能及时的反应上去(要通知UI重绘)。具体用上面方法,你自己斟酌吧。