C# WPF 执行耗时操作防止界面卡死,并对运行界面进行操作

在写程序时,有时我们需要连接数据库或者其他服务器,此时可能会消耗很长时间,并出现界面卡死。如果用鼠标点击窗口,会显示“无响应”。这是因为耗时操作在UI线程中,阻塞了UI线程,所以网上大多数建议采用多线程,将耗时操作和UI线程分开。以下以连接数据库为例。

首先要using System.Threading;

然后创建连接数据库的sqlconnection

string connString = Properties.Settings.Default.ConnectionString; //设置连接字符串,这里的连接字符串在程序中设置好了,直接引用过来。
            SqlConnection conn = new SqlConnection(connString);  //创建一个SqlConnection实例

接着,将耗时操作定义在一个函数中

void connect()
            {
                try
                {
                    conn.Open();                    
                }
                catch (Exception ex) { MessageBox.Show("连接失败:\r\n" + ex.ToString());}
                finally
                {
                    //此时,你可能需要对界面进行一些操作,比如更改某个Label的文字,或者关闭窗口。如果直接用Label.content="";或者this.close();会报错。
因为不能在非UI线程中更改UI线程里的控件。这时要用Invoke方法,把操作放在delegate后面的花括号里。
注意WPF在用Invoke方法时,要先调用Dispatcher。
this.Dispatcher.Invoke(new Action (delegate {
                        if (conn.State == ConnectionState.Open)
                        {
                            StaffAdmin.MainWindow mainWindow = new MainWindow();
                            mainWindow.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                            mainWindow.Show();
                        }
                    }));
                    this.Dispatcher.Invoke(new Action(delegate { this.Close(); }));
                }                 
            }

最后创建一个Thread实例,并启动Thread。

Thread thread = new Thread(new ThreadStart(connect));//将耗时操作的函数放在ThreadStart后面的圆括号里
            thread.Start(); 

我现在对多线程还不是很了解,用的方法可能也不是最严密,最简单的。所以,还请老司机多带带。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值